Почему мой SQL Server быстрее при перезапуске? - PullRequest
2 голосов
/ 15 октября 2010

У нас есть приложение .net winforms, которое обращается к базе данных SQL Server 2008 через веб-службы .net.Время от времени наше приложение работает очень медленно, но после перезапуска службы SQL Server приложение работает намного быстрее.

У нас есть автоматическое запланированное задание, которое запускается каждую ночь для очистки буфера и кэша процедур с помощью следующих команд.

DBCC FREEPROCCACHE,
DBCC DROPCLEANBUFFERS

Кто-нибудь может подтвердить, что выполнение вышеуказанных команд может фактически снизить производительность запросов имы должны избавиться от этого?

Почему приложение запускается сравнительно быстро после перезапуска SQL Server?

Спасибо за помощь.

Редактировать: мы смотрели на несколькопотоки здесь и обнаружили, что временные таблицы могут быть проблемой здесь.когда сервер sql избавляется от всех временных таблиц при перезапуске и действует намного быстрее. что такое временные таблицы?мы выбираем #tables во многих местах в наших запросах.это временные таблицы, и можем ли мы что-то сделать в самой процедуре, чтобы удалить временные таблицы, когда они не нужны.

Спасибо.

Ответы [ 2 ]

8 голосов
/ 15 октября 2010

Поскольку вы спросили «почему», я собираюсь дать вам полный ответ:)

Выполнение DBCC FREEPROCCACHE и DBCC DROPCLEANBUFFERS на периодической основе не является эффективным решением вашей проблемы.Как и при перезапуске, если что-то улучшается, это только по стечению обстоятельств, и вы, скорее всего, увидите ошибочные результаты.Вполне возможно, что, если это «исправление» исправит вашу проблему с производительностью, оно вернется в будущем, казалось бы, случайно и с большей серьезностью, чем вы видите сейчас.

Когда вы запускаете DBCC FREEPROCCACHE, SQL Serverбудет перекомпилировать каждую хранимую процедуру или кешированный план запроса, который у нее будет при следующем запуске.Если выяснится, что SQL Server выбирает планы, которые лучше подходят для общей работы при следующем запуске, вы, как правило, увидите повышение производительности.Если SQL Server выберет план, который обычно работает хуже, вы увидите снижение производительности.Зачем ему выбирать план, который в целом хуже?Ну, это зависит от первого запроса, который будет выполнен - ​​SQL Server выберет план для оператора на основе избирательности переданных параметров.Взгляните на этот пример:

SET NOCOUNT ON;

IF OBJECT_ID('temporary_demo')     IS NOT NULL DROP TABLE temporary_demo;
IF OBJECT_ID('temporary_demoproc') IS NOT NULL DROP PROC  temporary_demoproc;
GO

CREATE TABLE temporary_demo (id int primary key identity(1,1), id2 int, txtval nvarchar(100));

insert temporary_demo (id2, txtval) values (1, 'something highly selective');

declare @i int;
set @i = 1;
while @i < 10000 begin
    insert temporary_demo (id2, txtval) select 2, 'something else ';
    set @i = @i + 1;
end

insert temporary_demo (id2, txtval) select 2, 'needle in a haystack';

create index ix_id2 on temporary_demo(id2);
GO

create proc temporary_demoproc @searchid int, @searchtxtval nvarchar(100) as
    select * from temporary_demo where id2 = @searchid and txtval = @searchtxtval;
GO

--Look at the query plans for both of these procedures.
--Note that the plan chosen depends on which one is called first.
exec temporary_demoproc 1, 'something highly selective';
exec temporary_demoproc 2, 'needle in a haystack';

dbcc freeproccache;

exec temporary_demoproc 2, 'needle in a haystack';
exec temporary_demoproc 1, 'something highly selective';

Итак, из примера видно, что если ваша производительность увеличивается из-за вызова DBCC FREEPROCCACHE, скорее всего, вы даете своему приложению шанс получить другой план запроса для ваших запросов при следующем запуске.Опять же - только случайно или случайно ваше приложение будет работать быстрее (или медленнее).

Что касается DBCC DROPCLEANBUFFERS, периодическое выполнение этого кода почти всегда замедляет работу вашего приложения.Эта команда заставляет запросы идти в подсистему хранения вместо чтения кэшированных страниц из памяти.Единственный способ, которым я могу думать о том, что это может помочь производительности, - это если конфигурация памяти вашего сервера баз данных неправильна, и он переключается на файл подкачки, потому что ему не хватает физической памяти.

Так в чем же решение?

Решение состоит в том, чтобы не искать общую причину или лейкопластырь.Вам нужно будет выполнить трассировку ваших плохо выполняющихся запросов с использованием профилировщика SQL Server и определить отдельные запросы, которые являются проблематичными.Вам нужно будет сделать некоторые «гайки и болты» анализ этих запросов и действительно понять их.Вам нужно будет выяснить, нужно ли добавлять, изменять или даже удалять индексы в зависимости от запроса, и вам нужно будет идентифицировать проблемные запросы, которые, возможно, придется переписать.

4 голосов
/ 15 октября 2010

Запуск DBCC FREEPROCCACHE и DBCC DROPCLEANBUFFERS очистит кэш, созданный процессом SQL Server.

Это может быть плохо - вы теряете все сохраненные планы выполнения, а это значит, что каждый последующий запрос должен теперь оцениваться, анализироваться и должен быть определен план выполнения - это будет замедляться каждый раз выполнение каждого запроса.

Это также может быть хорошо - это дает SQL Server возможность очиститься, избавиться от больших буферов, которые могут снизить производительность системы.

Есть ли шанс, что вы могли бы отключить эту ночную процедуру на неделю или две и посмотреть, будет ли ваше приложение работать лучше с этим выключенным ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...