Как выяснить все старые планы запросов из Microsoft SQL Server?

dba.stackexchange https://dba.stackexchange.com/questions/530

  •  16-10-2019
  •  | 
  •  

Вопрос

У нас есть приложение OFF SHELF, которое использует базу данных Microsoft SQL. В рамках этого приложения мы выбираем различные критерии выбора для каждого отчета. Это приложение затем запускает эти отчеты.

Я считаю, что у нас есть проблема с планом запросов. Первый отчет, который мы запускаем каждый день, работает очень быстро 7 минут. Любой отчет, который мы запускаем после первого отчета, занимает более часа.

Каждую ночь мы запускаем запланированную задачу, которая останавливает и запускает агент SQL Server и SQL Server. В этом одном экземпляре SQL Server имеется около 25 других баз данных. Никакие другие базы данных не имеют проблем с производительностью, только тот, который вы не упоминал ранее.

Есть ли способ очистить все планы запросов, которые SQL Server в настоящее время имеет в памяти?

Как я могу сделать это, не влияя на 30 пользователей, которые полагаются на другие базы данных на одном и том же сервере?

Это было полезно?

Решение

Мои извинения за мой предыдущий ответ.

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

2) Вы должны Создайте руководство по плану, которое использует запрос плана использования Намекните на каждый тип запроса (каждый тип запроса на процедуру), чтобы установить план выполнения.

Вот статья о плане исполнения, который может помочь.

Другие советы

Вы задали здесь два вопроса. Во -первых, вы хотите знать, можете ли вы удалить все планы, хранящиеся в памяти для экземпляра SQL. Это делается с DBCC Freeproccache, как предложил Мэтт М.

Второй вопрос, который вы задали: «Как я могу сделать это, не влияя на 30 пользователей, которые полагаются на другие базы данных на том же сервере?». Короткий ответ - «Ты не можешь». Если вы удалите все планы, чем другие пользователи, которые полагаются на планы в памяти, вероятно, пострадают от успеха.

Обходной путь для этого требует некоторого ручного вмешательства. Вы можете использовать dbcc freeproccache для удаления конкретных планов, при условии, что у вас есть plan_handle.

Из того, что вы описываете выше, это звучит как проблема плана, но я не уверен, что удаление планов является ответом. Я бы указал вам в направлении обдумывания параметров, прежде чем подумать об удалении планов:

http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/08/11/conor-vs-misbehaving-parametized-queries-optimize-for-hints.aspx

Вы должны иметь возможность оптимизировать запросы, а не дурачиться с DBCC Freeproccache на запланированной основе. Я также посоветовал бы вам потратить время на анализ событий ожидания для вашего экземпляра.

DBCC Freeproccache

Используя эту команду, вы можете очистить весь кэш процедуры до одной команды. Определенно прочитайте документацию перед использованием этой команды. Прочитайте раздел замечаний несколько раз.

Очистка кеша процедур приведет к перекомплектованию кэши с сохраненной процедурой при следующем использовании. Это может повлиять на производительность. Используйте внимательно!

Матт

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top