Графическое изображение плана исполнения, выдаваемого SQL Query Analyzer   

SQL Query Analyzer – интерактивное графическое средство, которое позволяет администратору базы данных или разработчику писать запросы, выполнять различные запросы одновременно, просматривать результаты, анализировать план запроса и получать поддержку для улучшения плана выполнения. Опция просмотра плана выполнения графически показывает методы получения данных, используемые оптимизатором запроса Microsoft SQL Server 2000. В графическом исполнении плана используются иконки для представления специфичных действий и запросов в SQL Server, а не изображения в виде таблиц, созданных инструкциями SET SNOWPLAN_ALL или SET SNOWPLAN_TEXT. Это очень полезно для понимания скоростных показателей запроса. Кроме того, SQL Query Analyzer показывает советы по дополнительным индексам и статистическим данным в неиндексируемых колонках, что улучшит возможности оптимизатора запроса рационально обработать запрос. В частности, SQL Query Analyzer показывает какие статистические данные пропущены, тем самым, заставляя оптимизатор запроса давать оценку по селективности, а затем дает возможность создать пропущенные статистические данные.

Иконки, изображенные в графическом плане исполнения, представляют физические операторы, которые используются MS SQL Server для выполнения запроса, и представлены ниже:

Assert – логический и физический оператор проверки условия. Например, он проверяет ссылочную целостность данных или проверку ограничений или гарантирует, что скалярный подзапрос возвращает одну строку. Для каждого ввода строки, Assert – оператор вычисляет выражение колонки Argument. Если это выражение является NULL, строка проходит оператор Assert. Если выражение NOT NULL, появится соответствующая ошибка.


The Bookmark Lookup – это физическая или логическая операция использования закладки (указателя строки или ключа кластерного индекса) для поиска соответствующей строки в таблице или кластерном индексе. Колонка Argument содержит значение закладки, используемое для поиска строки в таблице или кластерном индексе. Также содержит имя таблицы или кластерного индекса, в котором будет осуществляться поиск. Если используется выражение WITH PREFETH, то обработчик запроса считает, что в данном случае выгодно использовать асинхронное предварительное считывание данных (опережающее чтение).


Clustered Index Delete – физический оператор, удаляет строки из кластерного индекса, заданного в колонке Argument. Если есть параметр WHERE:() в колонке Argument, то удаляются только те строки, которые соответствуют условию.


Clustered Index Insert - физический оператор, который вставляет строки из ввода в кластеризованный индекс, соответствующий в колонке Argument. В этой колонке будет также параметр SET:(), указывающий на значение, которое будет присвоено каждой из соответствующих колонок.


Clustered Index Scan – логический и физический оператор сканирует кластеризованный индекс, определенный в колонке Argument. Если есть опциональный параметр WHERE:(), то возвращаются только те строки, которые соответствуют параметру. Если колонка Argument содержит параметр ORDERED, процессор запроса предложит вывод строк в том порядке, в котором они отсортированы в кластерном индексе. Если упорядочения нет, индекс будет отсканирован самым оптимальным образом (но не гарантируется, что вывод будет отсортирован).


Clustered Index Seek (поиск) – логическая и физическая операция, использующая поисковую способность индексов извлекать хранимые строки из кластеризованного индекса. Колонка Argument содержит название использованного кластеризованного индекса, и параметр SEEK:(). SQL server использует индекс, чтобы обрабатывать только те строки, которые соответствуют параметру SEEK:(). Дополнительно может указываться параметр WHERE:(), который SQL server применяет к каждой из найденных строк диапазона удовлетворяющего параметру SEEK:(). Если колонка Argument содержит парметр ORDERED, процессор запроса определяет, что строки должны выдаваться в том порядке, в котором они отсортированы в кластерном индексе. Если упорядочения нет, индекс будет отсканирован самым оптимальным образом (но не гарантируется, что вывод будет отсортирован). Позволить , чтобы вывод был отсортирован может быть менее эффективно, чем если бы вывод был неотсортированным.

Clustered Index Update – физический оператор, обновляющий исходные строки в кластеризованном индексе, указанные в колонке Argument. Если есть параметр WHERE:(), обновляются только те строки, которые соответствуют этому параметру. Если есть указатель SET:(), то он указывает значение, устанавливаемое для каджой из колонок. Если есть параметр DEFINE:(), то в список вносятся значения, которые определил этот оператор. Эти значения могут приводиться в качестве ссылки в параметре SET или где-то в рамках оператора или запроса.


Collapse – логический и физический оператор, оптимизирующий процесс обновления. Когда выполняется обновление, оно может быть разделено на удаление и вставку. Если колонка Argument содержит указатель обновляются и перечень группировочных колонок, процессор запроса группирует колонки по наборам ключей с целью оптимизировать операцию обновления, избавляясь от временных ненужных операций обновления на каждой строке.


Compute Scalar – логический и физический оператор, вычисляющий выражение с целью предоставления скалярного значения, которое может быть возвращено пользователю или представлено в виде таблицы в запросе, например в условии или в объединении (JOIN).


Concatenation – логический и физический оператор, сканирующий многочисленные источники, возвращая каждую отсканированную строку.



Constant Scan – логический и физический оператор, вводящий постоянную строку в запрос. Она будет возвращена либо нулем, либо одной строкой, которая обычно не содержит колонки. Оператор Compute Scalar часто используется, чтобы добавить колонки в строке, созданные Constant Scan


Deleted Scan – логический и физический оператор, сканирующий таблицу Deleted в рамках триггера.



Filter (clsColumn) - свойство обьекта ClassType clsColumn. Определяет условие фильтра, которое применяется к запросу SQL, который возвращает папки для извлекаемой модели. Обратите внимание, что эта особенность применяется только к колонкам, которые принадлежат извлекаемой модели объектов Subclass Type sbclsRegular. Читать/записывать для колонок с Subclass Type sbclsNested, только читать для всех остальных. Примечания Для колонок с Subclass Type sbclsRegular, эта особенность возвращает собственность Фильтра родительского объекта. Колонки могут быть вставлены, так что родительский объект может быть или объект clsMiningModel или объект clsColumn.


Hash Match - физический оператор, создающий хэш таблицу путем вычисления значения hash-функции для каждой строки из построенного входа. Параметр HASH:() с перечнем колонок, использованных для создания Hash-значения, появляется в колонке Argument. Затем для каждой подходящей строки он высчитывает Hash-значение (используя ту же Hash- функцию) и показывает в Hash-таблице для пар. Если есть параметр RESIDUAL:() в колонке Argument, то указатель должен также соответствовать строкам, которые рассматриваются как пара. Образ действия мало отличается, основываясь на уже выполненной логической операции:

  • Для любых соединений используется первый (верхний) ввод, чтобы создать раздробленную таблицу и второй (нижний) ввод, чтобы протестировать эту таблицу. Результат – пара (или не пара), как продиктовано типом соединения. Если многочисленные соединения используют одну и ту же объединенную колонку, то эти операции группируются в одну Hash-цепочку.
  • Для distinct или aggregate операторов используется ввод, чтоб создать хэш таблицу (путем удаления дубликатов или подсчета агрегатного выражения). Когда хэш таблица создана, сканируется таблица и выводятся все вхождения.
  • Для оператора UNION используется первый вход, чтобы создать хэш таблицу (с удалением дубликатов). Второго вход, который не должен иметь дубликаты, нужен для тестирования Hash-таблицы, возвращая все строки, не имеющие пары, затем сканирует hash-таблицу и возвращает все соответствия

 

Hash Match Root – физический оператор, согласующий действие всех операторов Hash Match Team сразу напрямую. Оператор The Hash Match Root и операторы Hash Match Team напрямую за ним отражают общую hash-функцию и разделяют общую стратегию. Оператор Hash March Root всегда возвращает вывод оператору, который не является членом цепочки (группы).


Hash Match Team Team – физический оператор, который является частью цепочки (группы) объединенных hash-операторов, отображающих общую hash- функцию и разделяющих общую стратегию.


Index Delete – физический оператор, который удаляет строки ввода из некластеризованного индекса, указанного в колонке Argument. Если есть указатель WHERE:(), то удаляются только те строки, которые соответствуют указателю.


Index Insert – физический оператор, который вставляет строки из своего ввода в некластеризованный индекс, указанный в колонке Argument. Колонка Argument может также содержать указатель SET:(), который указывает на значение, определяемое для каждой из колонок.


Index Scan – логический и физический оператор, который извлекает все строки из некластеризованного индекса, указанного в колонке Argument. Если появляется дополнительный параметр WHERE:() в колонке Argument, возвращаются только те строки, которые соответствуют этому параметру. Если колонка Argument содержит ORDERED - оператор, то процессор запроса определяет, что строки должны быть возвращены в порядке сортировки некластерного индекса. Если нет ORDERED-оператора, то искать индекс будет обрабатываться самым оптимальным способом, но без гарантии отсортированности вывода.


Index Seek - логический и физический оператор, который использует возможность поиска индексов с целью извлечения строк из некластеризованного индекса. Колонка Argument содержит название используемого некластеризованного индекса. Она также содержит параметр SEEK:(). Использует индекс для поиска только тех строк, которые соответствуют параметру SEEK:(). Он может содержать параметр WHERE:(), который будет проверяться по отношению ко всем строкам, которые соответствуют параметру SEEK:() (индексы для этого не используются). Если колонка Argument содержит ORDERED-оператор, процессор запроса определяет, что строки должны быть возвращены в порядке сортировки некластерного индекса. Если нет ORDERED-оператора, то искать индекс будет обрабатываться самым оптимальным способом, но без гарантии отсортированности вывода. Если позволить выходу сохранять свой порядок, то это будет менее эффективней, нежели создание несортированного выхода.


Index Spool– физический оператор содержит указатель SEEK:() в колонке Argument. Оператор Index Spool сканирует свои строки ввода, размещая копию каждой строки в скрытом файле спулинга – файл, в который в процессе спулинга сбрасывается копия каждой строки (сохраняется в базе данных tempdb и существует только в течение существования запроса) и создает индекс по всем строкам. Это позволяет использовать возможность поиска индексов для вывода только тех строк, которые соответствуют указателю SEEK: (). Если оператор повторяется заново (например, в цикле Nested Loops), то вместо повторного сканирования входа используется spool-таблица.


Index Update – физический оператор, обновляющий строки из его ввода в некластеризованном индексе, соответствующему в колонке Argument. Если есть параметр WHERE:(), то обновляются только те строки, которые соответствуют этому параметру. Если есть параметр SET: (), то он указывает на значение, определяемое для каждой из колонок. Если есть параметр DEFINE:(), он составляет список тех значений, которые определяет оператор. Эти значения могут быть предоставлены в виде таблиц в SET - операторе, или где-нибудь в рамках оператора или запроса.


Inserted Scan – логический и физический оператор, сканирующий таблицу inserted в триггер.



Log Row Scan – логический и физический оператор, сканирующий журнал транзакций.



Merge Join – физический оператор, представляющий Inner Join, Left Outer Join, Left Semi Join, Left Anti Semi Join, Right Outer Join, Right Semi Join, Right Anti Semi Join, and Union логические операции. В колонке Argument оператор Merge Join содержит указатель MERGE:(), если операция представлена типом соединения «один ко многим», или MANY-TO-MANY MERGE:(), если операция представлена типом соединения «множество-множество». Колонка Argument может также содержать перечень колонок, отделенных запятой, использованные для выполнения операции. Оператор Merge Join требует двух вводов, отсортированных по своим колонкам соответственно, возможно путем добавления лишней операции сортировки в план запроса. Эта операция особенно эффективна, если добавление сортировки не требуется, например, если существует подходящий индекс в базе данных или если порядок сортировки может быть использован для многочисленных операций, таких как объединение и группировка со сворачиванием (roll up).


Nested Loops – физический оператор, представляющий Inner Join, Left Outer Join, Left Semi Join, и Left Anti Semi Join операции. Соединения nested Loops представляют поиск по внутренней таблице для каждой строки внешней таблицы, обычно использующий какой-то индекс. MS SQL Server решает, основываясь на предугадывании стоимости, стоит ли рассортировывать внешний выход с целью улучшения положения поисков индекса над (по) внутреннему входу. Возвращаются любые строки, которые соответствуют дополнительному указателю в колонке Argument, (основываясь на представленной логической операции).


Parallelism– физический оператор, представляющий распределенные потоки, собранные потоки и перераспределенные потоки логических операций. Колонка Argument может содержать указатель PARTITION COLUMNS: () с перечнем колонок, разделенных запятой. Колонка Argument также может содержать указатель ORDERED BY:() с перечнем колонок, для которых порядок сортировки сохраняется в течение разделения.


Parameter Table Scan – логический и физический оператор, сканирующий таблицу, которая выступает в качестве параметра в текущем запросе. Обычно это используется для запросов INSERT в рамках хранимой процедуры.


Remote Delete – логический и физический оператор, удаляющий строки ввода из дистанционного объекта.



Remote Insert - логический и физический оператор, вставляющий строки ввода в дистанционный объект.



Remote Query – логический и физический оператор, предлагающий запрос дистанционному ресурсу. Текст запроса, посланный на дистанционный сервер, появляется в колонке Argument.


Remote Scan – логический и физический оператор, который отсканирует дистанционный объект. Название дистанционного объекта появится в колонке Argument.



Remote Update – логический и физический оператор, обновляющий строки ввода в дистанционном объекте.



Row Count Spool – физический оператор, сканирующий ввод, подсчитывает сколько строк существует и возвращаются, поскольку много строк может быть без данных в них. Этот оператор используется, когда важней провести проверку на существование строк, чем на данные, содержащиеся в этих строках. Например, если оператор Nested Loops представляет собой левую полусоединенную операцию и объединенный показатель используется для внутреннего ввода, Row Count Spool может быть перемещен наверх внутреннего ввода оператора Nested Loops. Затем этот оператор может просматривать как много строк на выходе, благодаря Row Count Spool (поскольку реальные данные не нужны из внутренней стороны), чтоб определить, нужно ли возвращать внешнюю строку.


Sequence – логический и физический оператор, управляющий большими планами обновления. Функционально, он выполняет каждый ввод в последовательности (сверху вниз). Каждый ввод – обычно обновление различных объектов. Он возвращает только те строки, которые поступают с последнего ввода.


Sort – логический и физический оператор, сортирующий все строки ввода. Колонка Argument содержит указатель DISTINCT ORDER BY: (), если дублирующиеся строки удаляются или указатель ORDER BY:() если нет, с перечнем рассортированных колонок, разделенных запятой. Колонки имеют префикс ASC, если колонки рассортированы в порядке возрастания, или префикс DESC, если колонки рассортированы в порядке убывания.


Stream Aggregate – физический оператор, опционально группирующий набор колонок и высчитывающий один или несколько агрегирующих выражений, возвращенных запросом и/или ссылающиеся на что-либо в рамках запроса. Этот оператор требует того, чтобы ввод располагался в определенном порядке колонками в рамках группы. Если оператор Stream Aggregate группирует по колонками, то указатель GROUP BY: () и перечень колонок появляется в колонке Argument. Если оператор Stream Aggregate вычисляет любые выражения, их перечень появится в колонке вывода Defined Values из отчета SNOWPLAN_ALL или в колонке графического плана исполнения.


Table Delete – физический оператор, удаляющий строки из таблицы, соответствующие колонке Argument. Если есть указатель WHERE:() в колонке Argument, будут удалены только те строки, которые соответствуют указателю.


Table Insert – физический оператор, вставляющий строки из своего ввода в таблицу в колонке Argument. Эта колонка также может содержать параметр SET:(), который указывает на значение, устанавливаемой для каждой из колонок.


Table Scan – логический и физический оператор, возвращающий все строки из таблицы, указанной в колонке Argument. Если параметр WHERE:() появляется в колонке Argument, то возвращаются только те строки, которые соответствуют параметру.


Table Spool – физический оператор, сканирующий ввод и помещающий копию каждой строки в скрытой таблице спулинга (сохраняемой в базе данных tempdb и существующей только в течение существования запросов). Если оператор повторяется заново (например, в цикле Nested Loops), то вместо повторного сканирования входа используется spool-таблица.


Table Update – физический оператор, обновляющий строки ввода в таблице, соответствующие в колонке Argument. Если есть указатель WHERE:(), то обновляются только те строки, которые соответствуют этому указателю. Если есть указатель SET:(), он указывает устанавливаемое значение для каждой из колонок. Если есть указатель DEFINE:(), то составляется список значений, который определяет этот оператор. Эти значения могут быть представлены в виде таблиц в SET-операторе или где-то еще в рамках оператора или запроса.


Top - логический или физический оператор, который будет сканировать ввод, возвращая только первое указанное количество или процентное соотношение строк. Колонка Argument может опционально содержать перечень колонок, которые проверяются на связи. В планах запросов на обновление, оператор - Top используется для ограничения количества обрабатываемых строк.


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

Dynamic Динамический курсор. Этот курсор может просматривать все изменения, сделанные другими пользователями.



Fetch Query – возвращает прочитанные данные из курсора.



Keyset - этот курсор может просматривать обновления, сделанные другими пользователями, но не вставки, сделанные ими.



Population Query – Это запрос заполняет рабочую таблицу курсора при открытии курсора.



Refresh Query – этот запрос получает текущие данные для строк в буфере.



Snapshot – этот курсор не видит изменений, сделанные другими пользователями.



Чтение графического вывода плана выполнения.

Вывод графического плана исполнения MS-SQL Query Analyzer читается слева направо и сверху вниз. Каждый запрос в группе, проходя анализ, появляется, включая стоимость каждого запроса в процентном отношении общей стоимости группы.

  • Каждое звено древовидной структуры представлено как иконка, которая соответствует логическому и физическому оператору, использованному для выполнения части запроса или положения.
  • Каждое звено связано с родительским звеном. Все звенья с одинаковым родителем перемещаются в одинаковые колонки. Правила со стрелами связывают каждое звено с родителем.
  • Рекурсивные операции показаны с помощью символов итерации.
  • Операторы показываются как символы, связанные с соответствующим родителем.
  • Когда запрос содержит несколько отдельных инструкций, показывается план выполнения для каждой инструкции в отдельности.
  • Части древовидной структуры определяются типом выполненной инструкции.

T-SQL и хранимые процедуры:

Если инструкция это текст T-SQL или хранимая процедура, то она становится основой графического плана исполнения древовидной структуры. Хранимая процедура может иметь многочисленные дочерние уровни, которые представляют собой инструкции, вызванные хранимой процедурой. Каждый дочерний уровень – узел или ветвь дерева.

Язык манипулирования данными (DML):

Если выполняется инструкция языка манипулирования данными, такая как SELECT, INSERT, DELETE или UPDATE, положение языка манипулирования данных – корень дерева. Инструкции языка манипулирования данных могут иметь дочерних уровня. Первый уровень – выполнение плана для инструкции языка манипулирования данных. Второй уровень представляет собой триггер, если он использован в результате выполнения инструкции.

Условия:

Графическое исполнение плана условных инструкций, таких как IF…ELSE делятся на трех детей. Инструкция IF…ELSE становится корнем. Условие IF становится узлом поддерева. Условия THEN и ELSE представлены как положения блоков. WHILE и DO_UNTIL положения представлены по такому же принципу.

Реляционные операторы:

Выполненные операции, такие как сканирование таблицы, соединения и агрегации представлены узлами на дереве.

DECLARE CURSOR:

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

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

  • Физический оператор использован, такой как Hash Join или Nested Loops. Физические операторы выделяются красным указателем, которым оптимизатор запроса говорит об опасности, такой как отсутствие статистических данных или пропущенные параметры соединения. Это может быть явиться причиной того, что оптимизатор запросов выбрал план менее эффективный, чем ожидалось. Графическое исполнение плана предполагает коррективное действие, такое как обновление статистических данных или создание индекса. Пропущенные статистические данные колонки и индексов могут быть немедленно созданы или обновлены, с помощью контекстного меню MS-SQL Query Analizer.
  • Логический оператор, который соответствует физическому оператору, такой как Join-оператор. Логический оператор, если отличается от физического, регистрируется после физического в начале контекстной подсказки и отделяется косой чертой (/).
  • Число строк выводимых оператором.
  • Предполагаемый объем строки выводимой оператором.
  • Предполагаемая цена всех операций ввода/вывода для операции. Это значение должно быть настолько низким, насколько это возможно.
  • Предполагаемая стоимость операции для всех центральных процессоров.
  • Количество раз, которое данная операция была выполнена.
  • Стоимость операции, включая стоимость операции в процентном выражении от общей стоимости запроса. Поскольку оптимизатор запроса выбирает наиболее результативную операцию для представления запроса или выполнения инструкции, это значение должно быть настолько низким, насколько это возможно.
  • Общая стоимость для оптимизатора запроса в выполнении этой операции и всех операций, предшествующих данной в этом поддереве.
  • Указатели и параметры использованные запросом.

  Статья написана по материалам BOL и MSDN.

 


Перепечатка, воспроизведение в любой форме, распространение, в том числе в переводе, любых материалов с сайта www.softpoint.ru возможны только с письменного разрешения компании "СофтПоинт". Это правило действует для всех без исключения случаев, кроме тех, когда в материале прямо указано разрешение на копирование (основание: Закон Российской Федерации "Об авторском праве и смежных правах").