Справочник по логическим и физическим операторам Showplan

Операторы описывают, как SQL Server выполняет запрос или инструкцию языка DML. Оптимизатор запросов использует операторы для построения плана запроса, чтобы создать результат, заданный в запросе, или произвести операцию, указанную в инструкции DML. План запроса — это дерево физических операторов. Можно просмотреть план запроса с помощью инструкций SET SHOWPLAN, параметров графического плана выполнения в среде Среда SQL Server Management Studio и классов событий SQL Server Profiler Showplan.

Операторы классифицируются как логические и физические.

  • Логические операторы
    Логические операторы описывают операции реляционной алгебры, используемые для обработки инструкции. Другими словами, логические операторы описывают на концептуальном уровне, какие действия следует совершить.

  • Физические операторы
    Физические операторы реализуют действия, описанные логическими операторами. Каждый физический оператор является объектом или процедурой, выполняющей операцию. Например, некоторые физические операторы обращаются к столбцам и строкам таблицы, индекса или представления. Другие физические операторы выполняют другие операции, такие как вычисления, статистическая обработка, проверка целостности данных или соединения. Физическим операторам соответствует их стоимость.

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

    • Init(): метод Init() заставляет физический оператор инициализировать себя и подготовить все необходимые структуры данных. Физический оператор может получать много вызовов Init(), хотя обычно получает лишь один.

    • GetNext(): метод GetNext() заставляет физический оператор получить первую или последующую строку данных. Физический оператор может получить много вызовов GetNext() или не получить ни одного.

    • Close(): при вызове метода Close() физический оператор выполняет некоторые действия по очистке и закрывается. Физический оператор получает только один вызов Close().

    Метод GetNext() возвращает одну строку данных, а число его вызовов отображается значением ActualRows в выводе инструкции Showplan, который формируется с использованием инструкций SET STATISTICS PROFILE ON или SET STATISTICS XML ON. Дополнительные сведения об этих параметрах инструкции SET см. в разделах SET STATISTICS PROFILE (Transact-SQL) и SET STATISTICS XML (Transact-SQL).

    Счетчики ActualRebinds и ActualRewinds, которые появляются в выводе инструкции Showplan, указывают на число вызовов метода Init(). Если оператор не находится внутри цикла соединения, ActualRebinds равняется одному, а ActualRewinds нулю. Если оператор находится внутри цикла соединения, сумма числа повторных привязок и сбросов на начало должна равняться количеству строк, обработанных снаружи цикла. Повторная привязка значит, что изменился один и более связанный параметр соединения, и внутреннюю часть нужно пересчитать. Сброс на начало значит, что не изменился ни один из связанных параметров и можно вновь использовать прежний внутренний результирующий набор.

    Счетчики ActualRebinds и ActualRewinds присутствуют в выводе инструкции Showplan в формате XML, который произведен с использованием инструкции SET STATISTICS XML ON. Они заполнены только для операторов Nonclustered Index Spool, Remote Query, Row Count Spool, Sort, Table Spool и Table-valued Function. Счетчики ActualRebinds и ActualRewinds могут быть заполнены также для операторов Assert и Filter, когда атрибут StartupExpression установлен в TRUE.

    Когда счетчики ActualRebinds и ActualRewinds присутствуют в выводе инструкции Showplan в формате XML, их значения сравнимы со значениями EstimateRebinds и EstimateRewinds. Когда они отсутствуют, оценочное число строк (EstimateRows) сравнимо с действительным числом строк (ActualRows) Обратите внимание, что действительный графический вывод Showplan отображает нули для действительных повторных привязок и сбросов на начало, когда те отсутствуют.

    Связанный счетчик ActualEndOfScans доступен только в том случае, когда вывод инструкции Showplan производится с помощью инструкции SET STATISTICS XML ON. Всякий раз, когда физический оператор достигает конца потока данных, этот счетчик увеличивается на единицу. Физический оператор может достигать конца своего потока данных ни одного, один или несколько раз. Как и в случае с повторными привязками и сбросами на начало, число окончаний просмотров может превышать единицу только в том случае, если оператор находится внутри цикла соединения. Количество окончаний просмотров должно быть меньше или равно сумме количеств повторных привязок и сбросов на начало.

Сопоставление физических и логических операторов

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

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

Описание оператора

Этот раздел содержит описания логических и физических операторов.

Значок графического плана выполнения

Оператор Showplan

Описание

Нет

Aggregate

Оператор Aggregate вычисляет выражения с функциями MIN, MAX, SUM, COUNT или AVG. Оператор Aggregate может быть логическим или физическим.

Значок оператора арифметического выражения

Arithmetic Expression

Оператор Arithmetic Expression вычисляет новое значение на основе существующих значений в строке. Оператор Arithmetic Expression не используется в SQL Server 2012.

Значок оператора Assert

Assert

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

Значок элемента «Назначить язык»

Assign

Оператор Assign присваивает переменной значение выражения или константы. Assign является элементом языка.

Нет

Asnyc Concat

Оператор Asnyc Concat применяется только в удаленных запросах (распределенных запросах). Он имеет n дочерних узлов и один родительский узел. Обычно некоторые дочерние узлы являются удаленными компьютерами, участвующими в распределенном запросе. Оператор Asnyc Concat выполняет вызовы методов open() одновременно ко всем дочерним узлам, а затем применяет к каждому битовую карту. Для каждого бита, равного 1, оператор Async Concat по запросу отправляет выходные строки родительскому узлу.

Значок оператора Bitmap

Bitmap

SQL Server использует оператор Bitmap для реализации фильтра по битовым маскам в планах параллельных запросов. Фильтрация по битовым маскам повышает скорость выполнения запросов, исключая строки, которые не могут производить соединенные записи, до передачи строк другим операторам, например оператору Parallelism. Фильтр по битовым картам использует компактное представление набора значений из таблицы, находящейся в одной части дерева операторов, для фильтрации строк из другой таблицы, находящейся в другой части дерева. Если сразу отсекать ненужные строки в запросе, последующие операторы работают с меньшим количеством строк, тем самым повышая общую производительность. Оптимизатор определяет, достаточно ли избирательна битовая маска, чтобы быть полезной, и в каких операторах применить фильтр. Bitmap является физическим.

Значок оператора Bitmap

Bitmap Create

Оператор Bitmap Create появляется на выходе инструкции Showplan, в которой строятся битовые маски. Bitmap Create является логическим оператором.

Значок оператора Bookmark Lookup

Bookmark Lookup

Оператор Bookmark Lookup производит поиск соответствующей строки в таблице или кластеризованном индексе по закладке (идентификатору строки или ключу кластеризации). Столбец Argument содержит метку закладки, предназначенную для поиска строки в данной таблице или кластеризованном индексе. Столбец Argument содержит также имя таблицы или кластеризованного индекса, в которых производится поиск. Если в столбце Argument присутствует предложение WITH PREFETCH, обработчик запросов определяет, что оптимальным решением при поиске закладки в таблице или кластеризованном индексе будет применение асинхронной упреждающей выборки (упреждающего чтения).

Оператор Bookmark Lookup не используется в SQL Server 2012. Вместо этого функцию поиска закладок обеспечивают операторы Clustered Index Seek и RID Lookup. Оператор Key Lookup также выполняет данные функции.

Нет

Branch Repartition

В плане параллельных запросов иногда содержатся концептуальные области итераторов. Все итераторы в рамках такой области могут обрабатываться параллельными потоками. Сами же области должны обрабатываться последовательно. Некоторые итераторы оператора Parallelism внутри отдельной области называются Branch Repartition. Итератор оператора Parallelism на границе двух таких областей называется Segment Repartition. Branch Repartition и Segment Repartition являются логическими операторами.

Нет

Broadcast

Оператор Broadcast имеет один дочерний и n родительских узлов. Broadcast рассылает входные строки нескольким получателям по требованию. Каждый пользователь получает полный набор строк. Например, если все получатели являются элементами хэш-соединения, то будет создано n копий хэш-таблиц.

Значок оператора Build hash

Build Hash

Указывает сборку хэш-таблицы пакета для индекса columnstore, оптимизированного для памяти xVelocity.

Нет

Cache

Cache является особой версией оператора Spool. Он сохраняет только одну строку данных. Cache является логическим оператором. Оператор Cache не используется в SQL Server 2012.

Значок оператора Clustered Index Delete

Clustered Index Delete

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

Значок оператора Clustered index insert

Clustered Index Insert

Оператор Clustered Index Insert инструкции Showplan вставляет строки со своего входа в кластеризованный индекс, указанный в столбце Argument. В столбце Argument также содержится предикат SET:(), который указывает значение, устанавливаемое для каждого столбца. Если оператор Clustered Index Insert не имеет потомков для вставки значений, то вставленная строка берется из самого оператора Insert. Clustered Index Insert является физическим оператором.

Оператор Clustered Index Merge

Clustered Index Merge

Оператор Clustered Index Merge применяет поток данных слияния к кластеризованному индексу. Оператор удаляет, обновляет или вставляет строки из кластеризованного индекса, заданного в столбце оператора Аргумент. Фактически выполненная операция зависит от значения столбца ACTION во время выполнения, указанного в столбце Argument оператора. Clustered Index Merge является физическим.

Значок оператора Clustered index scan

Clustered Index Scan

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

Значок оператора Clustered index seek

Clustered Index Seek

Оператор Clustered Index Seek использует поисковые возможности индексов для получения строк из кластеризованного индекса. Столбец Argument содержит имя используемого кластеризованного индекса и предикат SEEK:(). Подсистема хранилища использует этот индекс для обработки только тех строк, которые удовлетворяют данному предикату SEEK:(). Также может включаться предикат WHERE:(), в котором подсистема хранилища вычисляет выражение для всех строк, удовлетворяющих предикату SEEK:(), но это не является обязательным и не использует индексы для завершения процесса.

Если столбец Аргумент содержит предложение ORDERED, то обработчик запросов определил, что строки необходимо возвращать в том порядке, в котором их отсортировал кластеризованный индекс. Если предложение ORDERED отсутствует, подсистема хранилища выполняет поиск индекса оптимальным способом, без обязательной сортировки выходных данных. Сохранять порядок выходных данных является менее эффективным, чем формировать несортированные выходные данные. При указании ключевого слова LOOKUP выполняется поиск закладок. В SQL Server 2008 и более поздних версиях оператор Key Lookup обеспечивает функцию поиска закладок. Clustered Index Seek — это логический и физический оператор.

Значок оператора Clustered index update

Clustered Index Update

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

Значок оператора Collapse

Collapse

Оператор Collapse оптимизирует процедуру обновления. При выполнении она может быть разбита (оператором Split) на операции удаления и вставки. Столбец Argument содержит предложение GROUP BY:(), указывающее список ключевых столбцов. Если обработчик запросов встречает смежные строки, удаляющие и вставляющие одни и те же значения ключей, он заменяет эти отдельные операции на одну, более эффективную операцию обновления. Collapse является логическим и физическим оператором.

Просмотр индекса columnstore

Columnstore Index Scan

Оператор Columnstore Index Scan просматривает индекс columnstore, заданный в столбце Argument плана выполнения запроса.

Значок оператора Compute scalar

Compute Scalar

Оператор Compute Scalar вычисляет выражение и выдает вычисляемую скалярную величину. Затем эту величину можно вернуть пользователю или сослаться на нее в каком-либо запросе, а также выполнить эти действия одновременно. Примерами одновременного использования этих возможностей являются предикаты фильтра или соединения. Compute Scalar — это логический и физический оператор.

Операторы Compute Scalar в инструкциях Showplan, сформированных с помощью XML SET STATISTICS, могут не содержать элемент RunTimeInformation. (В графических инструкциях Showplan Фактическое число строк, Фактическое число повторных привязок и Фактическое число сбросов на начало могут отсутствовать в окне Свойства, если в среде Среда SQL Server Management Studio выбран параметр Включить действительный план выполнения.) В данном случае это означает, что хотя эти операторы были использованы в скомпилированном плане запроса, их работа выполнялась другими операторами в исполняемом плане запроса. Кроме того, обратите внимание, что число запусков на выходе Showplan, сформированных SET STATISTICS PROFILE, равно сумме повторных привязок и сбросов на начало в инструкциях Showplan, сформированных XML SET STATISTICS.

Значок оператора Concatenation

Concatenation

Оператор Concatenation просматривает несколько входов, возвращая каждую просмотренную строку. Оператор Concatenation обычно используется для реализации конструкции Transact-SQL UNION ALL. Физический оператор Concatenation имеет два или более входов и один выход. Он копирует строки из первого входного потока в выходной поток и повторяет эту операцию для каждого дополнительного входного потока. Concatenation является как логическим, так и физическим оператором.

Значок оператора Constant scan

Constant Scan

Оператор Constant Scan вводит в запрос одну или несколько константных строк. Оператор Compute Scalar часто используется после выполнения оператора Constant Scan. Он добавляет столбцы в строки, полученные в результате выполнения оператора Constant Scan.

Значок элемента языка Convert (компонент ядра СУБД)

Convert

Оператор Convert автоматически преобразует скалярные данные из одного типа в другой. Convert является элементом языка.

Нет

Cross Join

Оператор Cross Join соединяет каждую строку из первого (верхнего) входного параметра с каждой строкой второго (нижнего) входного параметра. Cross Join является логическим оператором.

Значок оператора курсора Cursor catchall

catchall

Общий значок отображается в тех случаях, когда с помощью логики, управляющей графическими планами визуализации, не удается найти подходящий значок для итератора. Значок общего захвата не обязательно указывает на ошибку. Существуют три значка общего захвата: синий (итераторы), оранжевый (курсоры) и зеленый (элементы языка Transact-SQL).

Нет

Cursor

Логический и физический операторы Cursor предназначены для описания того, каким образом выполняются операции запроса или обновления с участием курсора. Физические операторы описывают алгоритм физической реализации обработки курсора, например использование курсора, управляемого набором ключей. Каждый шаг выполнения курсора соответствует физическому оператору. Логические операторы описывают свойства курсора, например доступность курсора только для чтения.

Логические операторы включают в себя Asynchronous, Optimistic, Primary, Read Only, Scroll Locks, Secondary и Synchronous.

Физические операторы включают в себя Dynamic, Fetch Query, Keyset, Population Query, Refresh Query и Snapshot.

Значок элемента Declare языка

Declare

Оператор Declare выделяет локальную переменную в плане запроса. Declare является элементом языка.

Значок оператора Delete (компонент Database Engine)

Delete

Оператор Delete удаляет те строки из объекта, которые удовлетворяют необязательному предикату в столбце Argument.

Значок оператора Delete Scan

Deleted Scan

Оператор Deleted Scan просматривает удаленную таблицу в триггере.

Нет

Distinct

Оператор Distinct удаляет дубликаты из набора строк или из коллекции значений. Distinct является логическим оператором.

Нет

Distinct Sort

Логический оператор Distinct Sort просматривает входные данные, удаляя дубликаты и сортируя данные по столбцам, заданным в предикате DISTINCT ORDER BY:() столбца Argument. Distinct Sort является логическим оператором.

Значок оператора параллелизма Distribute streams

Distribute Streams

Оператор Distribute Streams используется только в параллельных планах запросов. Оператор Distribute Streams преобразует один входящий поток записей в несколько выходящих потоков. Формат и содержимое записей не меняются. Каждая запись из входящего потока направляется в один из выходящих потоков. Данный оператор автоматически сохраняет в выходящих потоках относительный порядок входящих записей. Чтобы определить выходящий поток, в который попадет запись из входящего потока, обычно используется хэширование.

Если выход является секционированным, столбец Argument содержит предикат PARTITION COLUMNS:() и столбцы секционирования. Оператор Distribute Streams является логическим оператором.

Значок оператора Dynamic cursor

Dynamic

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

Значок оператора Spool

Eager Spool

Оператор Eager Spool принимает весь ввод, сохраняя каждую строку в скрытый временный объект базы данных tempdb. Если оператор сбрасывается на начало (например оператором Nested Loops), но при этом не требуется повторная привязка, то вместо повторного сканирования ввода используются буферизованные данные. Если требуется повторная привязка, буферизованные данные удаляются, а объект буфера перестраивается путем повторного просмотра ввода. Оператор Eager Spool строит файл буфера «жадным» способом: когда родительский оператор запрашивает первую строку, оператор spool принимает все строки своего оператора ввода и сохраняет их в буфер. Eager Spool — логический оператор.

Значок оператора Fetch query cursor

Fetch Query

Оператор Fetch Query извлекает строки, если выборка выполняется в курсоре.

Значок оператора Filter (компонент Database Engine)

Фильтр

Оператор Filter просматривает входные данные и возвращает только те строки, которые удовлетворяют критерию фильтрации (предикату), представленному в столбце Argument.

Нет

Flow Distinct

Логический оператор Flow Distinct просматривает входные данные и удаляет дубликаты. Оператор Distinct принимает на входе все данные, чтобы выдать выходные данные, тогда как оператор FlowDistinct возвращает строки по мере поступления (если строка не является дубликатом, так как в этом случае она не возвращается).

Нет

Full Outer Join

Логический оператор Full Outer Join возвращает каждую строку, удовлетворяющую предикату соединения из первого (верхнего) входа и соединенную с каждой строкой из второго (нижнего) входа. Он также возвращает строки из:

  • первого входа, не имеющего соответствий во втором входе;

  • второго входа, не имеющего соответствий в первом входе.

Вход, не содержащий совпадающих значений, возвращается как значение NULL. Full Outer Join является логическим оператором.

Значок оператора параллелизма Gather streams

Gather Streams

Оператор Gather Streams используется только в планах параллельных запросов. Оператор Gather Streams считывает несколько входных потоков и создает один выходной поток записей, комбинируя все входные потоки. Формат и содержимое записей не меняются. Если этот оператор сохраняет порядок, все входные потоки должны быть упорядочены. В случае упорядоченного выхода в столбце Argument содержится предикат ORDER BY:(), а имена столбцов упорядочены. Gather Streams — логический оператор.

Значок оператора Hash match

Hash Match

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

  • Для любых соединений используйте первую (верхнюю) входную строку с целью построения хэш-таблицы, а вторую (нижнюю) входную строку — для тестирования хэш-таблицы. Выходные данные совпадают (или не совпадают) в зависимости от типа соединения. Если несколько операций соединения используют один и тот же столбец соединения, эти операции группируются в хэш-группу.

  • Для операторов Distinct и Aggregate используйте входные данные с целью построения хэш-таблицы (удаляя дубликаты и вычисляя любые статистические выражения). Когда хэш-таблица будет построена, просмотрите таблицу и выведите все записи.

  • Для оператора Union используйте первую входную строку с целью построения хэш-таблицы (с удалением дубликатов). Используйте вторую входную строку (в которой не должно быть дубликатов) с целью тестирования хэш-таблицы, возвращения всех строк, не имеющих совпадений, затем просмотрите хэш-таблицу для возвращения всех записей.

Hash Match является физическим оператором.

Значок элемента языка If

If

Оператор If выполняет условную обработку в зависимости от значения выражения. If является элементом языка.

Нет

Inner Join

Логический оператор Inner Join возвращает каждую строку, которая удовлетворяет соединению первого (верхнего) входа со вторым (нижним).

Значок оператора Insert (компонент Database Engine)

Insert

Логический оператор Insert вставляет строки из входного потока в объект, заданный в столбце Argument. Соответствующим физическим оператором является Table Insert, Index Insert или Clustered Index Insert.

Значок оператора Inserted scan

Inserted Scan

Оператор Inserted Scan просматривает таблицу inserted. Inserted Scan является логическим и физическим оператором.

Значок элемента языка Intrinsic

Intrinsic

Оператор Intrinsic вызывает внутреннюю функцию Transact-SQL. Intrinsic является элементом языка.

Значок оператора Iterator catchall

Iterator

Общий значок Iterator отображается в тех случаях, когда с помощью логики, управляющей графическими планами Showplan, не удается найти подходящий значок для итератора. Значок общего захвата не обязательно указывает на ошибку. Существуют три значка общего захвата: синий (итераторы), оранжевый (курсоры) и зеленый (конструкции языка Transact-SQL).

Значок оператора Bookmark Lookup

Key Lookup

Оператор Key Lookup выполняет поиск закладок в таблице с кластеризованным индексом. Столбец Аргумент содержит имя кластеризованного индекса и ключ кластеризации, который используется для поиска строки в кластеризованном индексе. Оператор Key Lookup всегда сопровождается оператором Nested Loops. Если в столбце Аргумент присутствует предложение WITH PREFETCH, обработчик запросов определяет, что оптимальным решением при поиске закладки в таблице или кластеризованном индексе будет применение асинхронной упреждающей выборки (упреждающего чтения).

Использование оператора Key Lookup в плане запроса указывает, что запрос может выиграть от настройки производительности. Например, производительность запроса можно повысить, добавив покрывающий индекс.

Значок оператора курсора Keyset

Keyset

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

Общий значок захвата элемента языка

Language Element

Общий значок Language Element отображается в тех случаях, когда с помощью логики, управляющей графическими планами Showplan, не удается найти подходящий значок для итератора. Значок общего захвата не обязательно указывает на ошибку. Существуют три значка общего захвата: синий (итераторы), оранжевый (курсоры) и зеленый (конструкции языка Transact-SQL).

Значок оператора Spool

Lazy Spool

Логический оператор Lazy Spool сохраняет все строки входных данных в скрытом временном объекте, который хранится в базе данных tempdb. Если оператор сбрасывается на начало (например оператором Nested Loops), но при этом не требуется повторная привязка, то вместо повторного сканирования ввода используются буферизованные данные. Если требуется повторная привязка, буферизованные данные удаляются, а объект буфера перестраивается путем повторного просмотра ввода. Оператор Lazy Spool производит отложенное построение своего буферного файла: каждый раз, когда родительский оператор буфера запрашивает строку, оператор буферизации получает строку из своего входного оператора и сохраняет ее в буфер, а не обрабатывает все строки сразу. Lazy Spool — это логический оператор.

Нет

Left Anti Semi Join

Оператор Left Anti Semi Join возвращает каждую строку первого (верхнего) входа, для которой нет соответствующей строки во втором (нижнем) входе. Если в столбце Argument предиката соединения нет, то каждая строка будет считаться подходящей. Left Anti Semi Join является логическим оператором.

Нет

Left Outer Join

Оператор Left Outer Join возвращает строки, удовлетворяющие условию соединения первого (верхнего) входа со вторым (нижним) входом. Он также возвращает строки из первого входа, не имеющие соответствия строкам во втором входе. Строки, не имеющие соответствия строкам во втором входе, возвращаются как значения NULL. Если в столбце Argument предиката соединения нет, то каждая строка будет считаться подходящей. Left Outer Join является логическим оператором.

Нет

Left Semi Join

Оператор Left Semi Join возвращает каждую строку из первого (верхнего) входа, для которой есть соответствующая строка во втором (нижнем) входе. Если в столбце Argument предиката соединения нет, то каждая строка будет считаться подходящей. Left Semi Join является логическим оператором.

Значок оператора Log row scan

Log Row Scan

Оператор Log Row Scan просматривает журнал транзакций. Log Row Scan является логическим и физическим оператором.

Значок оператора Merge interval

Merge Interval

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

Значок оператора Merge Join

Merge Join

Оператор Merge Join выполняет внутреннее соединение, левое внешнее соединение, левое полусоединение, левое антиполусоединение, правое внешнее соединение, правое полусоединение, правое антиполусоединение, а также логические операции соединения.

В столбце Argument оператор Merge Join содержит предикат MERGE:(), если операция устанавливает соединение «один ко многим», или предикат MANY-TO-MANY MERGE:(), если операция устанавливает соединение «многие ко многим». Столбец Argument содержит также список столбцов, используемых для выполнения операции с разделителями-запятыми. Оператор Merge Join требует наличия двух входных значений, отсортированных в соответствующих столбцах, что можно сделать с помощью вставки явных операций сортировки в план запроса. Соединение слиянием особенно эффективно в случаях, когда явной сортировки не требуется, например, когда в базе данных имеется подходящий индекс сбалансированного дерева или когда порядок сортировки может использоваться для нескольких операций вроде соединения слиянием или группирования со сведением. Merge Join является физическим.

Значок оператора Nested loops

Nested Loops

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

Значок оператора Nonclustered index delete

Nonclustered Index Delete

Оператор Nonclustered Index Delete удаляет входные строки из некластеризованного индекса, указанного в столбце Argument. Nonclustered Index Delete является физическим оператором.

Значок оператора Nonclustered index insert

Index Insert

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

Значок оператора Nonclustered index scan

Index Scan

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

Значок оператора Nonclustered index seek

Index Seek

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

Значок оператора Nonclustered index spool

Index Spool

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

Значок оператора Nonclustered index update

Nonclustered Index Update

Физический оператор Nonclustered Index Update обновляет строки, указанные во входных параметрах, в некластеризованном индексе, заданном в столбце Argument. При наличии предиката SET:() данное значение устанавливается для каждого обновляемого столбца. Nonclustered Index Update является физическим оператором.

Значок оператора Online index insert

Online Index Insert

Физический оператор Online Index Insert указывает, что операции создания, изменения и удаления индекса выполняются в сети. То есть данные базовых таблиц по-прежнему доступны для пользователей во время операции с индексом.

Нет

Parallelism

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

ПримечаниеПримечание

Если запрос был скомпилирован как параллельный, но во время выполнения запускается как последовательный, то выходные данные инструкции Showplan, сформированные SET STATISTICS XML или с помощью параметра Включить действительный план выполнения в среде Среда SQL Server Management Studio, не будут содержать элемент RunTimeInformation для оператора Parallelism. В выходных данных инструкции SET STATISTICS PROFILE подсчет действительного числа строк и фактическое количество выполнений для оператора Parallelism будут равны нулю. Любое из этих условий означает, что оператор Parallelism использовался только при компиляции запроса, но не в рабочем плане запроса. Обратите внимание, что иногда планы параллельных запросов выполняются последовательно, если сервер выполняет большое количество параллельных запросов.

Значок оператора Parameter table scan

Parameter Table Scan

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

Нет

Partial Aggregate

Оператор Partial Aggregate используется в параллельных планах. Он применяется в статистической функции к максимальному числу входных строк, чтобы избежать записи на диск (сброса на диск). Hash Match —— это единственный физический оператор (итератор), реализующий статистическую обработку секций. Partial Aggregate является логическим оператором.

Значок оператора курсора Population query

Population Query

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

Значок оператора курсора Refresh query

Refresh Query

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

Значок оператора Remote delete

Remote Delete

Оператор Remote Delete удаляет входные строки удаленного объекта. Remote Delete является логическим и физическим оператором.

Оператор Showplan Remote Index Seek

Remote Index Scan

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

Оператор Showplan Remote Index Seek

Remote Index Seek

Оператор Remote Index Seek использует возможности поиска объекта удаленного индекса, чтобы получить строки. Столбец Argument содержит имя используемого удаленного индекса и предикат SEEK:(). Remote Index Seek является логическим физическим оператором.

Значок оператора Remote insert

Remote Insert

Оператор Remote Insert вставляет входные строки в удаленный объект. Remote Insert является логическим и физическим оператором.

Значок оператора Remote query

Remote Query

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

Значок оператора Remote scan

Remote Scan

Оператор Remote Scan позволяет удаленно просматривать необходимые объекты. Имя удаленного объекта появляется в столбце Argument. Remote Scan является логическим и физическим оператором.

Значок оператора Remote update

Remote Update

Оператор Remote Update обновляет входные строки удаленного объекта. Remote Update является логическим и физическим оператором.

Значок оператора параллелизма Repartition streams

Repartition Streams

Оператор Repartition Streams собирает несколько потоков и создает несколько потоков записей. Формат и содержимое записей не меняются. Если оптимизатор запросов использует фильтр по битовым картам, то число строк в выходном потоке сокращается. Каждая запись из входного потока помещается в один выходной поток. Если оператор настроен для сохранения порядка, то все входные потоки упорядочиваются и сливаются в несколько упорядоченных выходных потоков. Если выход является секционированным, столбец Argument содержит предикат PARTITION COLUMNS:() и столбцы секционирования. В случае упорядоченного выхода в столбце Argument содержится предикат ORDER BY:() и упорядочиваемые столбцы. Repartition Streams — это логический оператор. Он используется только в параллельных планах запроса.

Значок элемента Result языка

Result

Оператор Result представляет собой данные, возвращенные в конце плана запроса. Обычно он является корневым элементом инструкции Showplan. Result является элементом языка.

Значок оператора RID lookup

RID Lookup

Оператор RID Lookup осуществляет поиск закладки в куче при помощи заданного идентификатора строки. Столбец Argument всегда содержит метку закладки, которая применяется для поиска строки в таблице, и имя таблицы, в которой осуществляется поиск. Оператор RID Lookup всегда сопровождается оператором NESTED LOOP JOIN. RID Lookup является физическим оператором. Дополнительные сведения о поиске закладок см. в разделе Bookmark Lookup на веб-узле MSDN в блоге SQL Server.

Нет

Right Anti Semi Join

Оператор Right Anti Semi Join выводит каждую строку второго (нижнего) входного множества, для которой не существует соответствующей строки в первом (верхнем) входном множестве. Соответствующая строка определяется как строка, которая удовлетворяет предикату в столбце Аргумент (если предиката не существует, то каждая строка является строкой соответствия). Right Anti Semi Join является логическим оператором.

Нет

Right Outer Join

Оператор Right Outer Join возвращает каждую строку, которая удовлетворяет соединению второго (нижнего) входа с первым (верхним). Она также возвращает все строки из второго входа, для которых нет совпадений в первом, соединяя их со значением NULL. Если в столбце Argument предиката соединения нет, то каждая строка будет считаться подходящей. Right Outer Join является логическим оператором.

Нет

Right Semi Join

Оператор Right Semi Join возвращает каждую строку из второго (нижнего) потока входных данных, если имеется соответствующая строка в первом (нижнем) потоке входных данных. Если в столбце Argument предиката соединения нет, то каждая строка будет считаться подходящей. Оператор Right Semi Join является логическим.

Значок оператора Row count spool

Row Count Spool

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

Значок оператора Segment

Segment

Segment является физическим и логическим оператором. Он делит входной набор на сегменты в соответствии со значением одного или нескольких столбцов. Эти столбцы отображаются в виде аргументов оператора Segment. Затем оператор выводит по одному сегменту за раз.

Нет

Segment Repartition

В плане параллельных запросов иногда содержатся концептуальные области итераторов. Все итераторы в рамках такой области могут обрабатываться параллельными потоками. Сами же области должны обрабатываться последовательно. Некоторые итераторы оператора Parallelism внутри отдельной области называются Branch Repartition. Итератор оператора Parallelism на границе двух таких областей называется Segment Repartition. Branch Repartition и Segment Repartition являются логическими операторами.

Значок оператора Sequence

Sequence

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

Значок оператора Sequence project

Sequence Project

Оператор Sequence Project добавляет столбцы для выполнения вычислений над упорядоченным набором. Он делит входной набор на сегменты в соответствии со значением одного или нескольких столбцов. Затем оператор выводит по одному сегменту за раз. Эти столбцы отображаются как аргументы оператора Sequence Project. Sequence Project является логическим и физическим оператором.

Значок оператора курсора Snapshot

Моментальный снимок

Оператор Snapshot создает курсор, который не видит изменений, сделанных другими курсорами.

Значок оператора Sort

Sort

Оператор Sort сортирует входящие строки. Столбец Аргумент содержит либо предикат DISTINCT ORDER BY:(), если в этой операции удаляются дубликаты, либо предикат ORDER BY:() с разделенным запятыми списком сортируемых столбцов. Столбцы имеют префикс со значением ASC, если они сортируются по возрастанию, или значением DESC, если сортируются по убыванию. Sort — это логический и физический оператор.

Значок оператора Split

Split

Оператор Split используется для оптимизации процесса обновления. Он разбивает каждую операцию обновления на операции удаления и вставки. Оператор Split является логическим и физическим оператором.

Значок оператора Spool

Spool

Оператор Spool сохраняет промежуточные результаты запроса в базе данных tempdb.

Значок оператора Stream aggregate

Stream Aggregate

Оператор Stream Aggregate группирует строки в один или несколько столбцов и вычисляет одно или несколько агрегатных выражений, возвращенных запросом. Выход этого оператора может быть использован последующими операторами запроса, возвращен клиенту или то и другое. Оператору Stream Aggregate необходимы входные данные, упорядоченные по группируемым столбцам. Оптимизатор использует перед этим оператором оператор Sort, если данные не были ранее отсортированы оператором Sort или используется упорядоченный поиск или просмотр в индексе. В инструкции SHOWPLAN_ALL или графическом плане выполнения в среде Среда SQL Server Management Studio столбцы в предикате GROUP BY перечисляются в столбце Argument, а агрегатное выражения — в столбце Defined Values. Stream Aggregate является физическим оператором.

Значок оператора Switch

Параметр

Оператор Switch представляет собой особый тип итератора объединения, который имеет n входов. Выражение связывается с каждым оператором Switch. В зависимости от возвращаемого значения выражения (между 0 и n-1) оператор Switch копирует соответствующий входной поток в выходной поток. В частности, оператор Switch применяется при реализации планов запроса, содержащих быстрые курсоры прямого направления с такими операторами, как TOP. Switch является и логическим, и физическим оператором.

Значок оператора Table delete

Table Delete

Физический оператор Table Delete удаляет строки из таблицы, указанной в столбце Аргумент плана выполнения запроса.

Значок оператора Table insert

Table Insert

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

Оператор Table Merge

Table Merge

Оператор Table Merge применяет поток данных слияния к куче. Оператор удаляет, обновляет или вставляет строки в таблицу, указанную в столбце Argument оператора. Тип выполненной операции зависит от значения времени выполнения столбца ACTION, указанного в столбце Argument оператора. Table Merge является физическим оператором.

Значок оператора Table scan

Table Scan

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

Значок оператора Table spool

Table Spool

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

Значок оператора Table update

Table Update

Физический оператор Table Update обновляет входные строки в таблице, указанной в столбце Аргумент плана выполнения запроса. Предикат SET:() определяет значение для каждого обновляемого столбца. Эти значения могут быть упомянуты в предложении SET или в другом месте в этом операторе, а также в каком-либо другом месте в рамках запроса.

Значок оператора Table-valued function

Table-valued Function

Оператор Table-valued Function вычисляет функцию с табличным значением (языка Transact-SQL или среды CLR) и сохраняет строки результата в базе данных tempdb. Когда родительские итераторы запрашивают эти строки, оператор Table-valued Function возвращает эти строки из базы данных tempdb.

Запросы, вызывающие функции с табличным значением, формируют планы запросов с итератором Table-valued Function. Функция с табличным значением может вычисляться с различными значениями параметров:

  • Модуль чтения функции с табличным значением XML принимает XML-документ типа BLOB как параметр и возвращает набор строк, представляющий XML-узлы в том же порядке, что и в XML-документе. Другие параметры могут ограничивать возвращаемые XML-узлы подмножеством XML-документа.

  • Модуль чтения функции с табличным значением XML с фильтром XPath — это специальный тип модуля чтения возвращающей табличное значение функции XML, ограничивающий результат XML-узлами, удовлетворяющими выражению XPath.

Оператор Table-valued Function — это логический и физический оператор.

Значок оператора Top

В начало

Оператор Top просматривает входные данные и возвращает только указанное число или процент строк, выбранных, возможно, на основе порядка сортировки. Столбец Аргумент может содержать список столбцов, которые проверяются на наличие связей. Планируется использовать оператор Top для соблюдения ограничений на число строк. Top — это логический и физический оператор. Top — это логический и физический оператор.

Нет

Top N Sort

Оператор Top N Sort аналогичен итератору Sort за исключением того, что использует только первые N строк, а не весь результирующий набор. Для небольших значений N ядро выполнения запросов SQL Server пытается выполнить операцию сортировки полностью в памяти. Для больших значений N ядро выполнения запросов использует более общий способ сортировки, в котором N не является параметром.

Значок оператора Extended (UDX)

UDX

Расширенные операторы (UDX) реализуют часть операций XQuery и XPath в SQL Server. Все операторы UDX являются и логическими, и физическими операторами.

Расширенный оператор (UDX) FOR XML используется для сериализации реляционных наборов строк, которые он получает на входе, в представление XML в одном столбце BLOB в единственной строке на выходе. Это статистический оператор XML, учитывающий порядок данных.

Расширенный оператор (UDX) XML SERIALIZER — это статистический оператор XML, учитывающий порядок данных. Он получает на входе строки, представляющие XML-узлы или скаляры XQuery в порядке, соответствующем XML-документу, и выдает сериализованный XML BLOB в единственном XML-столбце единственной строки вывода.

Расширенный оператор (UDX) XML FRAGMENT SERIALIZER является особым видом оператора XML SERIALIZER, использующимся для обработки входных строк, представляющих фрагменты XML, вставляемые в расширении вставки данных XQuery.

Расширенный оператор (UDX) XQUERY STRING вычисляет строковое значение XQuery из входных строк, представляющих собой узлы XML. Это статистический строковый оператор, чувствительный к порядку данных. Он выводит одну строку со столбцами, представляющими скаляр XQuery, содержащий строковое значение входа.

Расширенный оператор (UDX) XQUERY LIST DECOMPOSER является оператором декомпозиции списка XQuery. Для каждой входной строки, представляющей собой узел XML, он создает одну или несколько строк, представляющих скаляр XQuery, содержащий значение элемента списка, если входные данные имеют тип списка XSD.

Расширенный оператор (UDX) XQUERY DATA определяет значение функции XQuery fn:data() для входных данных, представляющих собой узлы XML. Это статистический строковый оператор, чувствительный к порядку данных. Он выводит одну строку со столбцами, представляющими собой скаляр XQuery, содержащий значение функции fn:data().

Расширенный оператор XQUERY CONTAINS определяет значение функции XQuery fn:contains() для входных данных, представляющих собой узлы XML. Это статистический строковый оператор, чувствительный к порядку данных. Он выводит одну строку со столбцами, представляющими собой скаляр XQuery, содержащий значение функции fn:contains().

Расширенный оператор UPDATE XML NODE обновляет узел XML в расширении замены модификации данных XQuery с помощью метода modify() типа XML.

Нет

Union

Оператор Union просматривает несколько входов, выводя каждую просмотренную строку и удаляя дубликаты. Union — это логический оператор.

Значок оператора Update (компонент Database Engine)

Update

Оператор Update обновляет каждую строку, начиная с ее ввода в объект, указанный в столбце Argument плана выполнения запроса. Update является логическим оператором. Операторы Table Update, Index Update или Clustered Index Update являются физическими.

Значок элемента языка While

While

Оператор While реализует цикл while языка Transact-SQL. While является элементом языка.

Значок оператора Table spool

Window Spool

Оператор Window Spool расширяет каждую строку в набор строк, представляющий связанное с ним окно. В запросе предложение OVER определяет окно в наборе результатов запроса, а оконная функция затем вычисляет значения для каждой строки в окне. Window Spool является логическим и физическим оператором.