Работа с подсказкой USE PLAN
Подсказка USE PLAN принимает в качестве аргумента xml_plan. xml_plan представляет собой строковый литерал, полученный в XML–формате из плана, созданного для запроса.
![]() |
---|
Параметр xml_plan всегда нужно указывать как литерал в Юникоде, используя префикс N, например N'xml_plan'. Это гарантирует, что все символы в плане, характерные для стандарта Юникод, не будут утеряны при интерпретации строки сервером SQL Server 2005 Database Engine. |
В SQL Server 2005 планы запросов в формате XML могут быть созданы следующими способами.
- SET SHOWPLAN_XML
Важно!
При формировании планов запросов с помощью SET SHOWPLAN_XML одинарные кавычки ('), встречающиеся в плане, должны экранироваться вторыми кавычками, перед тем как план можно будет использовать в запросе с подсказкой USE PLAN. Например, план, содержащий WHERE A.varchar = 'This is a string'
, должен быть изменен и содержатьWHERE A.varchar = ''This is a string''
. - SET STATISTICS XML
- Запрос к столбцу query_plan функции динамического управления sys.dm_exec_query_plan.
- Классы событий Showplan XML, Showplan XML Statistics Profile и Showplan XML For Query Compile приложения SQL Server Profiler.
Дополнительные сведения о создании и анализе планов запросов см. в разделе Анализ запроса.
План запроса в формате XML, указанный в xml_plan , должен соответствовать определению схемы (XSD) Showplanxml.xsd, находящемуся в каталоге установки SQL Server 2005. Кроме того, в конце пути, создаваемом элементами <ShowPlanXML> <BatchSequence> <Batch> <Statements>
, должна присутствовать одна из следующих конструкций.
- Один или более элементов
<StmtSimple>
, только один из которых содержит элемент<QueryPlan>
. - Один элемент
<StmtCursor>
, содержащий только один элемент<CursorPlan>
. - Один или более элементов
<StmtSimple>
без элементов<QueryPlan>
и один элемент<StmtCursor>
, содержащий один элемент<CursorPlan>
.
Перед использованием плана с помощью USE PLAN его можно изменить, например изменив порядок и операторы соединений или настроив операции просмотра и поиска. Однако формат плана по-прежнему должен соответствовать Showplanxml.xsd. Может не удаться форсировать план после его изменения. Если в подсказке USE PLAN используется план, не входящий во множество планов, которые SQL Server обычно рассматривает во время оптимизации запроса, то произойдет ошибка.
Планы запросов, созданные с подсказкой в запросе USE PLAN, кэшируются также, как и другие планы запросов.
Ограничения работы в запросе с подсказкой USE PLAN
Изменения базы данных, например удаление индексов, могут сделать недействительным план запроса, указанный USE PLAN. План запроса становится устаревшим, даже если на удаляемый объект нет прямых ссылок в плане. Например, явных ссылок на уникальный индекс в плане запроса может не быть, но индекс, тем не менее, накладывает на данные ограничение, гарантирующее уникальность. План запроса, на который ссылается USE PLAN, может использовать это ограничение, чтобы избежать применения определенных операторов для принудительного различения результатов.
Иногда установка пакета обновления или нового выпуска SQL Server может не дать форсировать план, созданный предыдущей версией. Поэтому все подсказки USE PLAN должны тестироваться после каждого обновления сервера.
Использование подсказки USE PLAN в запросе замещает все подсказки соединений и индексов, использующиеся в этом же запросе.
Подсказка USE PLAN не может использоваться с подсказками запросов FORCE ORDER, EXPAND VIEWS, GROUP, UNION или JOIN либо если параметру SET FORCEPLAN присвоено значение ON.
Форсировать с помощью USE PLAN можно только те планы запросов, которые были бы найдены обычной поисковой стратегией оптимизатора запросов. В таких планах обычно указывается, что один из потомков каждого соединения должен быть на конечном уровне. Использование USE PLAN для форсирования других типов запросов приведет к ошибке.
Форсируемые элементы плана запроса
Не все элементы плана запроса в формате XML форсируются с помощью подсказки USE PLAN. Элементы, вычисляющие скалярные выражения, пропускаются так же, как и некоторые выражения отношений. План запроса форсируется для следующих типов элементов.
- Структура дерева плана и порядок вычислений.
- Алгоритмы выполнения, например типы объединений, сортировок и соединений.
- Операции над индексами, например просмотр, поиск, пересечение и объединение.
- Объекты, на которые даны явные ссылки, например таблицы, индексы и функции.
В частности, SQL Server форсирует элементы LogicalOp
, PhysicalOp
и NodeID
, найденные в элементе <RelOp>
, а также все элементы, входящие в оператор <PhysicalOp>
. Остальное содержимое элемента <RelOp>
при использовании USE PLAN не рассматривается.
![]() |
---|
Информация об оценке размерности, определяемая элементом <EstimateRows> , не форсируется в запросе подсказкой USE PLAN. Так как оптимизатор запросов использует оценки размерности результатов для определения количества памяти, которое понадобится запросу, следует поддерживать аккуратную статистику даже при использовании USE PLAN. Дополнительные сведения см. в разделе Статистика индексов. |
В следующей таблице перечислены значения операторов отношения, которые форсируются подсказкой USE PLAN для элемента PhysicalOp
и элемента LogicalOp
, а также все вложенные элементы, требующиеся для каждого значения PhysicalOp
. В эту таблицу также включены дополнительные сведения, которые требуются каждому оператору в виде путей XPath относительно вложенных элементов.
PhysicalOp |
LogicalOp |
Вложенный элемент | Дополнительная информация1 |
---|---|---|---|
|
|
|
Неприменимо |
|
|
|
Неприменимо |
|
|
|
|
|
|
|
|
|
|
|
Неприменимо |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Неприменимо |
|
|
|
Неприменимо |
|
|
|
Неприменимо |
|
|
|
Неприменимо |
|
|
|
Неприменимо |
|
|
|
Неприменимо |
|
|
|
Неприменимо |
|
|
|
Неприменимо |
|
|
|
Неприменимо |
|
|
|
Неприменимо |
|
|
|
|
|
|
|
Неприменимо |
|
|
|
Неприменимо |
|
|
|
|
|
|
|
(имя возвращающей табличное значение функции находится в Object/@Table) |
|
|
|
Неприменимо |
|
|
|
Неприменимо |
|
|
|
Неприменимо |
|
|
|
|
1 Чтобы форсировать план с помощью USE PLAN, число и порядок операндов для каждого оператора отношения должны быть такими как показано в таблице.
2 Возможность форсировать план ограничена в том, что если план содержит элемент <RowCountSpool>, то он может появиться в форсируемом плане или как элемент <RowCountSpool>, или как <Spool>. Аналогичным образом, если план содержит элемент <Spool>, то он может появиться в форсируемом плане или как <Spool>, или как <RowCountSpool>.
Операторы Assert
, Bitmap
, ComputeScalar
и PrintDataFlow
подсказкой USE PLAN не рассматриваются. Оператор Filter
подсказкой USE PLAN рассматривается, но его конкретное расположение в плане не может быть форсировано.
Дополнительные сведения о логических и физических операторах в планах запросов см. в разделе Справочник по логическим и физическим операторам.
Поддержка курсоров
Подсказку USE PLAN можно использовать вместе с запросами, определяющими статические или опережающие курсоры, которые могут запрашиваться как с помощью Transact-SQL, так и через функции API-интерфейса. Поддерживаются однонаправленные статические курсоры Transact-SQL. Динамические, управляемые набором ключей и однонаправленные курсоры не поддерживаются.
Дополнительные сведения см. в разделе Использование подсказки USE PLAN в запросах с курсорами.
См. также
Основные понятия
Указание планов запросов с помощью форсирования планов
Другие ресурсы
Справка и поддержка
Получение помощи по SQL Server 2005
Журнал изменений
Версия | Журнал |
---|---|
15 сентября 2007 г. |
|