Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
SetSystemFileCacheSize off 1024
Дело в том, что в кэш записывается в буквальном смысле все, а вот освобождается кэш не всегда вовремя. Проблему с кэшем удалось решить с помощью программы EmptyStandbyList.exe.
Удивительным было то, что случайным образом удалось установить, что когда запрос в приложении выполняется медленно, то в самом SSMS он выполняется быстро.
You should always set ARITHABORT to ON in your logon sessions. Setting ARITHABORT to OFF can negatively impact query optimization leading to performance issues.
The default ARITHABORT setting for SQL Server Management Studio is ON. Client applications setting ARITHABORT to OFF can receive different query plans making it difficult to troubleshoot poorly performing queries. That is, the same query can execute fast in management studio but slow in the application. When troubleshooting queries with Management Studio always match the client ARITHABORT setting.
EXEC sp_configure 'user options', 64 ;
GO
RECONFIGURE ;
GO
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = "localhost";
builder.IntegratedSecurity = true;
builder.InitialCatalog = "AdventureWorks2014";
builder.ApplicationName = "test";
using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
using (SqlCommand command = new SqlCommand("select DB_NAME() + ':' + ' ARITHABORT ' + case when (@@OPTIONS & 64) = 64 then 'ON' else 'OFF' end", connection))
{
connection.Open();
command.CommandType = CommandType.Text;
object result = command.ExecuteScalar();
Console.WriteLine($"{result}");
}
declare @value int;
select @value = cast(value as int)
from sys.configurations
where name = 'user options';
if (@value & 64 = 0)
set @value += 64;
exec sp_configure 'user options', @value
go
reconfigure
godeclare @t table (name sysname, minimum int, maximum int, config_value int, run_value int);
insert into @t
exec sp_configure 'user options'
declare @config_value int
select @config_value = config_value from @t
set @config_value |= 64
select @config_value
exec sp_configure 'user options', @config_value
go
reconfigure
go
IMHO сбрасывать процедурный кэш — плохая практика. Поскольку это приводит к повторной компиляции процедур и построению нового плана, что является причиной временного снижения производительности запросов.
Запрос надо переписать, если нужно использовать хинты unknown. Статистику обновить. В общем лучше использовать один раз построенный план. Выше вам про магию очень точно подметили.
Про несколько месяцев не очень понял, сколько хп у вас? Поставьте мониторинг и разбирайте проблемы. Улучшить надо только то что тормозит, остальное не надо трогать. Это 5-7 дней работы DBA. Вроде прописные вещи.
Еще раз для ясности, если перегружаете продакт чтобы избавится от проблем или чистите кэш всей бд постоянно, признайтесь себе честно — вы не понимаете что происходит.
Перезагружать теперь не нужно, когда чистится периодически кэш всей ОС.
И я понимаю что происходит-чистить кэш ОС нужно периодически, до этого не было чистки.
Кэш видимо SQL все-таки имелся ввиду?
можно пруф который подтвердит это утверждение?
кроме этого часто к не очень хорошим последствиям приводит периодические операции shrink file/db
-- sqlcmd mode
:setvar DatabaseName "AdventureWorks2014"
IF DATABASEPROPERTY('$(DatabaseName)','IsAutoClose') = 1
begin
print 'autoclose = true'
ALTER DATABASE [$(DatabaseName)] SET AUTO_CLOSE OFF WITH NO_WAIT
print 'now autoclose = false'
end
Проблема с периодически долго выполняемыми запросами в MS SQL Server