Как очистить кеш запросов 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).

PaulB
источник
Дублирование: 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
Неверный синтаксис рядом с ключевым словом «OPTION». или Неверный синтаксис рядом с «НЕИЗВЕСТНО».
Пабрамс
1
@pabrams Они идут (как часть) вашего запроса следующим образом:select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Марк Авениус
1
Просто убедитесь, что вы АБСОЛЮТНО уверены, что вы случайно не добавили что-то подобное в код PRODUCTION - потому что это может вызвать серьезные проблемы в будущем.
Майкл К. Кэмпбелл
4
OPTIMIZE FOR UNKNOWN не игнорирует кэшированные планы. Скорее, при создании плана он указывает SQL-серверу выбирать «средние значения распределения, независимые от какой-либо [автоматической] параметризации» для принятия решения о том, какой план создать, - это приводит к планам, которые могут быть более непротиворечивыми при неоднородной статистике. ОПЦИЯ (RECOMPILE) создает новый план, но в противном случае не очищает / освобождает кэш данных - обычно это создает более идеальные планы за счет восстановления плана и затрат на кэширование плана.
user2864740
6
EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
GO
RECONFIGURE WITH OVERRIDE
GO

Какое значение вы указываете для памяти сервера, не важно, если оно отличается от текущего.

Кстати, причиной ускорения является не кеш запросов, а кеш данных.

erikkallen
источник
3

Обратите внимание, что ни то, ни другое DBCC DROPCLEANBUFFERS;не DBCC FREEPROCCACHE;поддерживается в хранилище данных SQL Azure / SQL.

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

Я лично делаю это как способ тестирования производительности запросов без необходимости иметь дело с кэшированными планами.

Подробнее о кэше процедур SQL Azure здесь

MSC
источник
Это не сработало для меня, тогда план был неизменным. Пожалуйста, смотрите здесь stackoverflow.com/questions/46987785/…
Meneghino