Новая подсказка плана легкого запроса

Tags: SQL Server 2017

Недавние обновления

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 в то, на что вы можете просто щелкнуть.

No Comments

Add a Comment