Як я можу очистити кеш запитів SQL Server?


199

У мене простий запит, що працює проти SQL Server 2005

SELECT * 
FROM Table 
WHERE Col = 'someval'

Перший раз, коли я виконую запит, можна взяти > 15 secs. Подальші виконавці повертаються назад < 1 sec.

Як я можу змусити SQL Server 2005 не використовувати кешовані результати? Я спробував бігти

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Але це, мабуть, не впливає на швидкість запиту (досі < 1 sec).


ДУПЛІКАТ: stackoverflow.com/questions/1856966/… але краще
Faiz

Відповіді:


259

Ось кілька хороших пояснень. перевірити це.

http://www.mssqltips.com/tip.asp?tip=1360

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

Із пов'язаної статті:

Якщо все тестування продуктивності проводиться в SQL Server, найкращим підходом може бути видача CHECKPOINT та видача команди DBCC DROPCLEANBUFFERS. Хоча процес CHECKPOINT є автоматичним внутрішнім системним процесом у SQL Server і відбувається регулярно, важливо виконати цю команду, щоб записати на диск та очистити буфери всі брудні сторінки для поточної бази даних. Тоді команда DBCC DROPCLEANBUFFERS може бути виконана для видалення всіх буферів з буферного пулу.


14
Один з майонів також включає DBCC FREEPROCCACHE
jaraics

1
Якщо ви використовуєте dropcleanbuffers, це для всіх, хто підключений до бази даних або лише для цього користувача?
Кріс Нобельс

1
@Kris: DBCC DROPCLEANBUFFERS видаляє всі чисті буфери з буферного пулу. Це необхідний крок у налаштуванні продуктивності запитів, і не слід використовувати його на живому SQL Server.
Саар

Це добре працює для SQL Server, але зауважте, що це не працює в SQL Azure - я опублікував альтернативне рішення нижче для обробки сценарію SQL Azure.
MSC

1
Добре, це єдина команда, яка насправді працює, перепробувала багато інших і не працювала.
Габріель Родрігес

15

Вісім різних способів очищення кешу плану

1. Видаліть усі елементи з кешу плану для всього екземпляра

DBCC FREEPROCCACHE;

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

2. Промийте кеш плану для всього екземпляра і пригнічіть повідомлення про регулярне завершення

"Виконання DBCC завершено. Якщо DBCC надрукував повідомлення про помилки, зверніться до системного адміністратора."

DBCC FREEPROCCACHE WITH NO_INFOMSGS;

3. Очистіть спеціальний і підготовлений кеш плану для всього екземпляра

DBCC FREESYSTEMCACHE ('SQL Plans');

4. Очистіть спеціальний і підготовлений кеш плану для одного пулу ресурсів

DBCC FREESYSTEMCACHE ('SQL Plans', 'LimitedIOPool');

5. Промийте весь кеш плану для одного пулу ресурсів

DBCC FREEPROCCACHE ('LimitedIOPool');

6. Видаліть усі елементи з кешу плану для однієї бази даних (не працює в SQL Azure)

-- Get DBID from one database name first
DECLARE @intDBID INT;
SET @intDBID = (SELECT [dbid] 
                FROM master.dbo.sysdatabases 
                WHERE name = N'AdventureWorks2014');

DBCC FLUSHPROCINDB (@intDBID);

7. Очистити кеш плану для поточної бази даних

USE AdventureWorks2014;
GO
-- New in SQL Server 2016 and SQL Azure
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

8. Видаліть один план запитів із кешу

USE AdventureWorks2014;
GO

-- Run a stored procedure or query
EXEC dbo.uspGetEmployeeManagers 9;

-- Find the plan handle for that query 
-- OPTION (RECOMPILE) keeps this query from going into the plan cache
SELECT cp.plan_handle, cp.objtype, cp.usecounts, 
DB_NAME(st.dbid) AS [DatabaseName]
FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st 
WHERE OBJECT_NAME (st.objectid)
LIKE N'%uspGetEmployeeManagers%' OPTION (RECOMPILE); 

-- Remove the specific query plan from the cache using the plan handle from the above query 
DBCC FREEPROCCACHE (0x050011007A2CC30E204991F30200000001000000000000000000000000000000000000000000000000000000);
 

Джерело 1 2 3


9

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

OPTION (OPTIMIZE FOR UNKNOWN)

Тоді ваш запит буде таким

select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)

1
Неправильний синтаксис біля ключового слова "ОПЦІЯ". або Неправильний синтаксис поблизу "НЕВІДОМЛЕНО".
пабрамс

1
@pabrams Вони йдуть після (як частини) вашого запиту так:select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Позначте Авеню

1
Просто переконайтеся, що АБСОЛЮТНО впевнено, що ви ненавмисно не впустите щось подібне до коду ВИРОБНИЦТВА - адже це може спричинити великі проблеми в дорозі.
Майкл К. Кемпбелл

4
ОПТИМІЗАЦІЯ ДЛЯ НЕЗНАЧЕНОГО не ігнорує кешовані плани. Швидше за все, при генерації плану він доручає SQL-серверу вибирати "середні значення розподілу, незалежні від будь-якої [автоматичної] параметризації" для вирішення того, який план створити - це призводить до планів, які можуть бути більш узгодженими в нерівномірній статистиці. ОПЦІЯ (RECOMPILE) створює новий план, але не інакше очищає / звільняє кеш даних - це зазвичай генерує більш ідеальні плани за рахунок регенерації плану та витрат на кешування плану.
користувач2864740

6
EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
GO
RECONFIGURE WITH OVERRIDE
GO

Яке значення, яке ви вказали для пам'яті сервера, не важливо, якщо воно відрізняється від поточного.

До речі, те, що викликає прискорення, - це не кеш запитів, а кеш даних.


3

Зауважте, що ні підтримується, DBCC DROPCLEANBUFFERS;ні DBCC FREEPROCCACHE;SQL Azure / SQL Data Warehouse.

Однак якщо вам потрібно скинути кеш плану в SQL Azure, ви можете змінити одну з таблиць у запиті (наприклад, просто додати та видалити стовпець), це призведе до побічного ефекту видалення плану з кешу .

Я особисто це роблю як спосіб тестувати ефективність запитів, не маючи справи з кешованими планами.

Детальніше про кеш процедур SQL Azure тут


Це для мене не вийшло, тоді план був незмінним. Дивіться тут stackoverflow.com/questions/46987785/…
Meneghino
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.