взаимодействие sys.dm_exec_query_stats с перекомпиляцией

Мы используем sys.dm_exec_query_stats для отслеживания медленных запросов и запросов, которые являются нарушителями IO.

Это отлично работает, мы получаем много очень проницательной статистики. Понятно, что это не так точно, как запуск трассировки профилировщика, поскольку вы понятия не имеете, когда SQL Server решит выработать план выполнения.

У нас довольно много запросов, в которых неправильный план выполнения кэшируется. Например, такие запросы, как:

ВЫБЕРИТЕ TOP 30
        a.Id
FROM Posts a
        JOIN Сообщения q ВКЛ q.Id = a.ParentId
        JOIN PostTags pt ON q.Id = pt.PostId
WHERE a.PostTypeId = 2
        И a.DeletionDate IS NULL
        И a.CommunityOwnedDate IS NULL
        И a.CreationDate> @Дата
        И LEN (a.Body)> 300
        И pt.Tag = @tag
        И a.Score> 0
ЗАКАЗАТЬ a.Score DESC

Проблема в том, что идеальный план действительно зависит от выбранной даты (снимок экрана идеального плана):

идеальные планы

Однако, если неправильный план кэшируется, он полностью задыхается, когда диапазон дат большой: (обратите внимание на большие жирные линии)

неправильный план

Чтобы преодолеть это, нам рекомендовалось использовать либо OPTION (OPTIMIZE FOR UNKNOWN), либо OPTION (RECOMPILE)

OPTIMIZE FOR UNKNOWN приводит к чуть лучшему плану, который далеко не оптимален. Исполнения отслеживаются в sys.dm_exec_query_stats.

RECOMPILE приводит к выбору лучшего плана, однако не выполняется счет , а статистика отслеживается в ---- +: = 6 =:. + ----

Есть ли еще DMV, который мы могли бы использовать для отслеживания статистики по запросам с помощью sys.dm_exec_query_stats? Это поведение по дизайну? Есть ли другой способ для перекомпиляции, сохраняя статистику, отслеживаемую в OPTION (RECOMPILE)?

Примечание. Framework всегда будет выполнять параметризованные запросы, используя sp_executesql

7 голосов | спросил Sam Saffron 11 MaramFri, 11 Mar 2011 01:02:58 +03002011-03-11T01:02:58+03:0001 2011, 01:02:58

1 ответ


1

Возможно, вам следует использовать руководство по плану вместо опции RECOMPILE. У вас уже есть хороший план, поэтому просто добавьте его в качестве руководства по вашему запросу, и оптимизатор будет каждый раз создавать этот план. См. Оптимизация запросов в развернутых приложениях с помощью руководств по настройкам и Указание планов запросов с помощью принудительного форматирования .

В вашем случае действительно тривиально, просто вызовите sp_create_plan_guide_from_handle с хорошим дескриптором плана запроса:

  

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

ответил Remus Rusanu 11 MaramFri, 11 Mar 2011 10:05:21 +03002011-03-11T10:05:21+03:0010 2011, 10:05:21

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132