Як ви очистити всі старі плани запитів з Microsoft SQL Server?


12

У нас вимкнений додаток, який використовує базу даних Microsoft SQL. У рамках цієї програми ми вибираємо різні критерії відбору для кожного звіту. Потім ця програма запускає ці звіти.

Я вважаю, що у нас є питання плану запитів. Перший звіт, який ми проводимо щодня, працює дуже швидко 7 хвилин. Будь-який звіт, який ми запускаємо після першого звіту, займає більше години.

Щовечора ми виконуємо заплановане завдання, яке зупиняється і запускає агент SQL Server і SQL Server. У цьому одному екземплярі SQL Server є приблизно 25 інших баз даних. Жодна інша база даних не має проблем із ефективністю, лише одна із продуктів на полиці, про які я згадував раніше.

Чи є спосіб очистити всі плани запитів, які SQL Server наразі має в пам'яті?

Як я можу це зробити, не впливаючи на 30 або більше користувачів, які покладаються на інші бази даних на тому ж сервері?


Відповіді:


7

Вибачте за попередню відповідь.

1) Додайте параметр З РЕКОМПЛІЮ до заяви CREATE PROCEDURE, якщо ви знаєте, що ваш запит змінюватиметься кожного разу, коли він запускається зі збереженої процедури. Параметр WITH RECOMPILE запобігає повторному використанню збереженого плану виконання процедури, тому SQL Server не кешує план цієї процедури, і процедура перекомпілюється під час виконання. Використання параметра "REC RECMPILE" може підвищити продуктивність, якщо ваш запит змінюватиметься кожного разу, коли він буде запущений із збереженої процедури, оскільки в цьому випадку неправильний план виконання не буде використовуватися.

2) Вам потрібно створити керівництво по плану, яке використовує підказку для запиту USE PLAN для кожного типу запиту (для кожного збереженого типу запиту процедури) для примусового виконання плану виконання.

Ось стаття про план виконання, який може допомогти.


Я погоджуюсь з використанням RECOMPILE, я робив це із створеними системами. Однак у мене немає доступу до джерела sql ... він працює з програми.
Майкл Райлі - AKA Gunny

@Cape Cod Gunny у такому випадку спробуйте DBCC FLUSHPROCINDB: використовується для очищення збереженого кешу процедур для певної бази даних на SQL сервері, а не для всього SQL Server. Ви можете використовувати цю команду перед тестуванням, щоб переконатися, що попередні збережені плани процедур не вплинуть негативно на результати тестування. Приклад: DECLARE @intDBID INTEGER SET @intDBID = (SELECT dbid FROM master.dbo.sysdatabases WHERE name = 'database_name') DBCC FLUSHPROCINDB (@intDBID)
garik

питання було вирішено. Виявилося, що таблиця тимчасових тем, що використовується для зберігання критеріїв пошуку, постійно накопичувала дані. Перед тим, як збирати дані, цей процес повинен усікати дані з цієї таблиці. Дякуємо за хороший фрагмент sql
Майкл Райлі - AKA Gunny

13

Ви тут задали два запитання. По-перше, ви хочете знати, чи можете ви видалити всі плани, що зберігаються в пам'яті, для екземпляра SQL. Це робиться з DBCC FREEPROCCACHE, як запропонував Метт М.

Друге запитання, яке ви задали, - "Як я можу це зробити, не зачіпаючи 30 користувачів користувачів, які покладаються на інші бази даних на тому ж сервері?" Коротка відповідь - "ти не можеш". Якщо ви видалите всі плани, ніж інші користувачі, які покладаються на плани, що знаходяться в пам’яті, швидше за все, це призведе до ефективності.

Вирішення цього потребує певного втручання вручну. Ви можете використовувати DBCC FREEPROCCACHE для видалення конкретних планів, якщо у вас є план_handle.

З того, що ви описуєте вище, це звучить як проблема плану, але я не впевнений, що видалення планів - це відповідь. Я хотів би вказати вам у бік нюхання параметрів, перш ніж замислюватися про видалення планів:

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

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


DBCC FREEPROCCACHE не вирішив цю проблему. Я моніторую діяльність та події. Є 0 фізичних вводу-виводу. Здається, висить у цьому додатку: .Net Sql Client Data Data Provider. Тип очікування - CXPACKET.
Майкл Райлі - AKA Gunny

CXPACKET означає, що ваш запит йде паралельно. Чи можете ви встановити, скільки потоків працює для запиту, і вивчити їх очікування? Ви можете скористатися безкоштовним інструментом Адама Маханіка WhoIsActive sqlblog.com/files/folders/release/entry29675.aspx .
SQLRockstar

7

DBCC FREEPROCCACHE

За допомогою цієї команди ви можете очистити весь кеш процедур до однієї команди. Визначно прочитайте документацію, перш ніж використовувати цю команду. Прочитайте розділ «Зауваження» кілька разів.

Очищення кешу процедур призведе до того, що збережені кеші процедур будуть перекомпільовані при наступному використанні. Це може вплинути на ефективність роботи. Використовуйте обережно!

Метт


Я спробував використовувати DBCC FREEPROCCACHE, і це не вирішило проблему. Я завершив процес вбивства через 1 годину.
Майкл Райлі - AKA Gunny
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.