Использование SQL Server Profiler для создания и проверки структур плана

Область применения:SQL ServerAzure SQL Database

При создании руководства по плану можно использовать SQL Server Profiler для записи точного текста запроса, используемого в аргументе statement_text хранимой процедуры sp_create_plan_guide. Тем самым гарантируется, что во время компиляции структура плана будет соответствовать запросу. После создания руководства по плану можно также использовать sql Server Profiler для проверки соответствия плана с запросом. Как правило, следует тестировать руководства по плану с помощью SQL Server Profiler, чтобы убедиться, что ваш запрос соответствует руководству по плану.

Извлечение текста запроса при помощи SQL Server Profiler

Если вы запускаете запрос и записываете текст точно так же, как он был отправлен в SQL Server с помощью SQL Server Profiler, можно создать руководство по плану типа SQL или TEMPLATE, которое будет точно соответствовать тексту запроса. Благодаря этому структура плана может использоваться оптимизатором запросов.

Рассмотрим следующий запрос, представленный приложением в виде изолированного пакета:

SELECT COUNT(*) AS c  
FROM Sales.SalesOrderHeader AS h  
INNER JOIN Sales.SalesOrderDetail AS d  
  ON h.SalesOrderID = d.SalesOrderID  
WHERE h.OrderDate BETWEEN '20000101' and '20050101';  

Предположим, необходимо, чтобы запрос был выполнен при помощи операции соединения слиянием, но SHOWPLAN указывает на то, что запрос не использует соединение слиянием. Запрос нельзя изменить непосредственно в приложении, поэтому создается структура плана, определяющая, что указание запроса MERGE JOIN должно быть присоединено к запросу во время компиляции.

Чтобы записать текст запроса точно так же, как SQL Server получает его, выполните следующие действия:

  1. Запустите трассировку SQL Server Profiler, убедитесь, что выбран тип события SQL:BatchStarting .

  2. Позвольте приложению выполнить запрос.

  3. Приостановка трассировки профилировщика SQL Server.

  4. Щелкните событие SQL:BatchStarting , соответствующее запросу.

  5. Щелкните событие правой кнопкой мыши и выберите Извлечь данные события.

    Внимание

    Не предпринимайте попыток скопировать текст пакета, выделяя его из нижней панели окна трассировки профайлера. Это может привести к несоответствию структуры плана исходному пакету.

  6. Сохраните данные события в файле. Это и будет текст пакета.

  7. Откройте в блокноте файл текста пакета и скопируйте текст в буфер копирования и вставки.

  8. Создайте структуру плана и вставьте скопированный текст внутри кавычек (''), заданных для аргумента @stmt . Одинарные кавычки в аргументе @stmt следует экранировать, поставив перед каждой одинарной кавычкой еще одну одинарную кавычку. Следите за тем, чтобы при вставке одинарных кавычек не были вставлены или удалены другие символы. Например, литерал даты '20000101' должен быть указан в следующем формате: ''20000101''.

Далее приводится структура плана:

EXEC sp_create_plan_guide   
    @name = N'MyGuide1',  
    @stmt = N'<paste the text copied from the batch text file here>',  
    @type = N'SQL',  
    @module_or_batch = NULL,  
    @params = NULL,  
    @hints = N'OPTION (MERGE JOIN)';  

Проверка структур планов при помощи SQL Server Profiler

Чтобы убедиться в том, что структура плана соответствует запросу, выполните следующие шаги.

  1. Запустите трассировку SQL Server Profiler, убедившись, что выбран тип события Showplan XML (расположенный под узлом производительности ).

  2. Позвольте приложению выполнить запрос.

  3. Приостановка трассировки профилировщика SQL Server.

  4. Найдите событие Showplan XML для соответствующего запроса.

    Заметка

    Событие XML-код инструкции Showplan компиляции запроса использовать нельзя. PlanGuideDB не существует в этом событии.

  5. Если структура плана имеет тип OBJECT или SQL, убедитесь, что событие Showplan XML содержит атрибуты PlanGuideDB и PlanGuideName для структуры плана, которая, как ожидается, соответствует запросу. Если структура плана имеет тип TEMPLATE, убедитесь, что событие Showplan XML содержит атрибуты TemplatePlanGuideDB и TemplatePlanGuideName для ожидаемой структуры плана. Тем самым производится проверка работы структуры плана. Эти атрибуты содержатся в элементе <StmtSimple> плана.

См. также

sp_create_plan_guide (Transact-SQL)