Как очистить кеш запросов SQL Server?

У меня простой запрос на SQL Server 2005

SELECT * 
FROM Table 
WHERE Col = 'someval'

При первом выполнении запроса можно взять > 15 secs. Последующие выполнения возвращаются в < 1 sec.

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

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Но это, похоже, не влияет на скорость запроса (еще < 1 sec).

Ответ 1

Вот несколько хороших объяснений. проверьте его.

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

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

Из связанной статьи:

Если все тесты производительности проводятся в SQL Server, лучшим способом может быть выпуск CHECKPOINT, а затем выдача команды DBCC DROPCLEANBUFFERS. Хотя процесс CHECKPOINT является автоматическим внутренним системным процессом в SQL Server и происходит на регулярной основе, важно выпустить эту команду для записи всех грязных страниц для текущей базы данных на диск и очистки буферов. Затем можно выполнить команду DBCC DROPCLEANBUFFERS, чтобы удалить все буферы из пула буферов.

Ответ 2

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

OPTION (OPTIMIZE FOR UNKNOWN)

Тогда ваш запрос будет таким:

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

Ответ 3

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

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

Btw, то, что вызывает ускорение, - это не кеш запросов, а кеш данных.

Ответ 4

Восемь различных способов очистки кеша плана

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

Ответ 5

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

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

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

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