У нас есть один конкретный запрос SQL Server 2008 (не хранимый процесс, а та же строка SQL - выполняется каждые 5 минут), который периодически кэширует очень плохой план запроса.
Этот запрос обычно выполняется за несколько миллисекунд, но с этим неправильным планом запроса он занимает более 30 секунд.
Как хирургическим путем удалить только один неверно кэшированный план запросов из SQL Server 2008, не удаляя весь кэш запросов на сервере производственной базы данных?
sql-server
sql-server-2008
cache
query
Джефф Этвуд
источник
источник
Ответы:
Я понял несколько вещей
покажет все кэшированные планы запросов. К сожалению, там нет текста SQL.
Однако вы можете присоединить текст SQL к планам следующим образом:
Отсюда довольно тривиально добавить
WHERE
предложение, чтобы найти SQL, который, как я знаю, находится в запросе, и затем я могу выполнить:удалить каждый план запроса из кэша плана запроса. Не совсем легко или удобно, но, похоже, работает ..
edit: дамп всего кэша запросов также будет работать, и это менее опасно, чем кажется, по крайней мере, по моему опыту:
источник
Если вы знаете, как выглядит хороший план, просто воспользуйтесь подсказкой плана .
Вы не можете удалить определенную запись кэша, но вы можете очистить весь пул кэша с помощью
DBCC FREESYSTEMCACHE(cachename/poolname)
.Вы можете получить имя кэша неверного плана запроса, если у вас есть дескриптор плана (из sys.dm_exec_requests.plan_handle для идентификатора сеанса, испытывающего проблемы во время выполнения, или из пост-выполнения sys.dm_exec_query_stats ):
Однако все планы SQL имеют название «Планы SQL», что делает выбор правильного для DBCC FREESYSTEMCACHE ... трудным выбором.
Обновить
Неважно, забыл
DBCC FREEPROCCACHE(plan_handle)
, да, это будет работать.источник
sys.dm_exec_cached_plans
нем нет записи дляplan_handle
fromsys.dm_exec_requests
?Решение FREEPROCCACHE хорошо, но более прямой способ сделать это - использовать OPTION (RECOMPILE) в вашей строке SQL (вы упомянули, что это не SP), это говорит Engine о плане одноразового использования, потому что, скорее всего, вы подозреваете есть анализ параметров или ваши статистические данные сильно отличаются от запуска к запуску, и вы подозреваете, что это проблема плохого кэшированного плана.
источник