Повторно выполнить конкретный фактический план запроса

7

Я захватил фактический план запроса для конкретного запроса.

После этого я изменил несколько вещей (включая обновление статистики) и перезапустил этот конкретный запрос. Теперь фактический план запроса другой (что имеет смысл).

Запрос теперь выполняется намного быстрее. Мне любопытно, связан ли с этим новый план выполнения, поскольку другие изменения (изменения в настройке ввода-вывода, настройках виртуальной машины, перезапуск экземпляра sql и т. Д.) Также могут привести к повышению производительности. Чтобы проверить это, я хотел бы еще раз выполнить запрос и попытаться заставить SQL Server использовать старый план выполнения.

Вопрос : есть ли способ повторно выполнить запрос с предоставленным пользователем планом выполнения или даже выполнить запрос непосредственно из такого плана?

Вот что я пытался выяснить это:

Итак, суть: возможно ли это? Если так: как?

Йерун
источник
Я использовал следующее для проверки длинных и коротких запросов в моих системах разработки и тестирования. Очистите существующие планы, буферы, кэши и выполните запрос (и) с трассировкой. Использование функций удаления / освобождения dbcc для очистки сеанса, кэша, буферов и т. Д. И выключения или отключения трассировки. Несвязанный, но полезный, чтобы увидеть, как обстоят дела с данными в таблице. Обратите внимание, что я видел, что вы используете S2K12, поэтому эти ссылки должны совпадать. Поведение может отличаться в более ранних версиях Sql Server. Надеюсь это поможет. DBCC FREESYSTEMCACHE, DROPCLEANBUFFERS, Trace On, show_statistics и т. Д.
Рэй Поррата,

Ответы:

10

Да.

Вам нужен USE PLANнамек.

В котором вы поставляете XMLс первого плана.

SELECT *
FROM T
OPTION (USE PLAN N'<?xml version="1.0" encoding="utf-16"?> ....')

Хотя это и не гарантирует, что план будет точно таким же (например, вычислительные скалярные операторы могут перемещаться, например), он, вероятно, будет довольно близок.

Мартин Смит
источник
Спасибо, именно то, что я просил. (К сожалению, это оставляет меня с новой проблемой: « Не удалось найти план запроса, потому что оптимизатор превысил число разрешенных операций при поиске плана, указанного в подсказке USE PLAN. », Но, думаю, это еще одна проблема, с которой я столкнулся.)
Йероен
@Jeroen - Хммм Не уверен, есть ли какая-то работа для этого. Может быть, есть какой-нибудь флаг трассировки, который увеличит этот лимит, но если он есть, я этого не знаю!
Мартин Смит
Нет проблем, спасибо за помощь в любом случае: узнал что-то новое сегодня! : D
Jeroen
@Jeroen - Может быть недокументированный TF 8780, который отключает тайм-ауты оптимизатора ? Не уверен, что это даст желаемый эффект.
Мартин Смит