Новая подсказка плана легкого запроса
Недавние обновления
SQL Server 2016 и 2017 представили новый USE HINT, который позволяет направить реальный план проведения на новое расширенное событие, называемое query_plan_profile.
Подсказка сама по себе ничего не делает, и XE сам по себе ничего не делает. Вам нужно иметь и то, и другое.
Хорошо, давайте сделаем это.
Сессии
Предположим, что вы используете поддерживаемую версию, и у вас есть каталог c:\temp, вы должны иметь возможность просто нажать F5.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
CREATE EVENT SESSION query_plan_profile ON SERVER ADD EVENT sqlserver.query_plan_profile ( SET collect_database_name = ( 0 )) ADD TARGET package0.event_file ( SET filename = N'c:\temp\query_plan_profile' ) WITH ( MAX_MEMORY = 4096KB, EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS, MAX_DISPATCH_LATENCY = 5 SECONDS, MAX_EVENT_SIZE = 0KB, MEMORY_PARTITION_MODE = NONE, TRACK_CAUSALITY = OFF, STARTUP_STATE = OFF ); GO ALTER EVENT SESSION query_plan_profile ON SERVER STATE = START; GO |
С этой настройкой давайте запустим запрос, который вызовет наше событие. Мы начнем просто:
1 2 3 4 5 |
SELECT TOP 1000 u.Id, u.DisplayName, u.Reputation, u.CreationDate, u.LastAccessDate FROM dbo.Users AS u ORDER BY u.Reputation, u.CreationDate OPTION ( USE HINT ( 'QUERY_PLAN_PROFILE' )); |
Теперь давайте посмотрим наши данные о событиях.
Ну, немного странно. В других событиях, которые собирают планы запросов, есть небольшая вкладка, в которой есть план запроса.
Например, событие query_post_execution_plan выглядит так.
Ну, может быть, это будет доступно в следующей версии SSMS или что-то в этом роде.
Или, может быть, мы можем щелкнуть по XML и получить план для открытия. Давайте попробуем это.
Итак, это не сработало, но оно открыло XML, поэтому мы можем его сохранить, а затем открыть как графический план.
Заинтригованы? Хорошо! Давайте взглянем.
Если мы щелкнем, мы обнаружим, что вы ожидаете от плана.
За исключением оператора SELECT. Первый узел - это TOP, поэтому вы не получаете некоторую информацию, которую обычно получаете от свойств и подсказок.
Вы получаете некоторые из них в области сведений, но не все.
Ну, это нормально. Давайте посмотрим на текст нашего запроса. Имеется в виду, что никто не собирается смотреть на план запросов и не может сказать, каков был их запрос.
Скорее всего, вы думаете о следующем: Вы только что запустили запрос, который должен сработать, если вы соберете sql_text в Event.
И в этом случае так и будет.
Но если у вас есть несколько человек, использующих эту технику для получения информации о плане, это может быть не так просто.
Добавление sql_text в Event покажет запрос, который запущен на панели сведений, но он все равно не отобразит текст запроса, если вы попытаетесь получить к нему доступ из самого плана.
Сбор текста запроса не всегда будет легким, поэтому мы разбираемся в том, почему это не учтено. Хотя вряд ли вы добавили бы это, например, каждое утверждение в очень длинную процедуру, и если вы делаете это для одного очень длинного запроса, вы, вероятно, знаете, во что ввязываетесь.
Но нет ничего такого, что могло бы однозначно идентифицировать план в Event. Если вы хотите использовать другие DMV для получения информации о плане, вам нужно настроить его, чтобы захватить запрос и спланировать хэши с самого начала.
В идеале вы должны настроить сеанс таким образом.
Transact-SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
CREATE EVENT SESSION query_plan_profile ON SERVER ADD EVENT sqlserver.query_plan_profile ( SET collect_database_name = ( 0 ) ACTION ( sqlserver.plan_handle, sqlserver.query_hash_signed, sqlserver.query_plan_hash_signed, sqlserver.sql_text ) ) ADD TARGET package0.event_file ( SET filename = N'c:\temp\query_plan_profile' ) WITH ( MAX_MEMORY = 4096KB, EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS, MAX_DISPATCH_LATENCY = 5 SECONDS, MAX_EVENT_SIZE = 0KB, MEMORY_PARTITION_MODE = NONE, TRACK_CAUSALITY = OFF, STARTUP_STATE = OFF ); GO |
Затем напишите кучу XQuery для синтаксического анализа события, соединения с различными системными представлениями и функциями и, возможно, даже конвертируйте этот план XML в то, на что вы можете просто щелкнуть.