Справочник по логическим и физическим операторам 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 вычисляет выражение в столбце Аргумент плана выполнения. Если значением этого выражения является NULL, строка передается через оператор Assert и выполнение запроса продолжается. При значении этого выражения, отличном от NULL, будет выдана соответствующая ошибка. Assert является физическим оператором. |
|||
Assign |
Оператор Assign присваивает переменной значение выражения или константы. Assign является элементом языка. |
|||
Нет |
Asnyc Concat |
Оператор Asnyc Concat применяется только в удаленных запросах (распределенных запросах). Он имеет n дочерних узлов и один родительский узел. Обычно некоторые дочерние узлы являются удаленными компьютерами, участвующими в распределенном запросе. Оператор Asnyc Concat выполняет вызовы методов open() одновременно ко всем дочерним узлам, а затем применяет к каждому битовую карту. Для каждого бита, равного 1, оператор Async Concat по запросу отправляет выходные строки родительскому узлу. |
||
Bitmap |
SQL Server использует оператор Bitmap для реализации фильтра по битовым маскам в планах параллельных запросов. Фильтрация по битовым маскам повышает скорость выполнения запросов, исключая строки, которые не могут производить соединенные записи, до передачи строк другим операторам, например оператору Parallelism. Фильтр по битовым картам использует компактное представление набора значений из таблицы, находящейся в одной части дерева операторов, для фильтрации строк из другой таблицы, находящейся в другой части дерева. Если сразу отсекать ненужные строки в запросе, последующие операторы работают с меньшим количеством строк, тем самым повышая общую производительность. Оптимизатор определяет, достаточно ли избирательна битовая маска, чтобы быть полезной, и в каких операторах применить фильтр. Bitmap является физическим. |
|||
Bitmap Create |
Оператор Bitmap Create появляется на выходе инструкции Showplan, в которой строятся битовые маски. Bitmap Create является логическим оператором. |
|||
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 |
Указывает сборку хэш-таблицы пакета для индекса columnstore, оптимизированного для памяти xVelocity. |
|||
Нет |
Cache |
Cache является особой версией оператора Spool. Он сохраняет только одну строку данных. Cache является логическим оператором. Оператор Cache не используется в SQL Server 2012. |
||
Clustered Index Delete |
Оператор Clustered Index Delete удаляет строки из кластеризованного индекса, указанного в столбце Argument плана выполнения запроса. При наличии в столбце Argument предиката WHERE:() удаляются только строки, удовлетворяющие условиям предиката. Clustered Index Delete является физическим оператором. |
|||
Clustered Index Insert |
Оператор Clustered Index Insert инструкции Showplan вставляет строки со своего входа в кластеризованный индекс, указанный в столбце Argument. В столбце Argument также содержится предикат SET:(), который указывает значение, устанавливаемое для каждого столбца. Если оператор Clustered Index Insert не имеет потомков для вставки значений, то вставленная строка берется из самого оператора Insert. Clustered Index Insert является физическим оператором. |
|||
Clustered Index Merge |
Оператор Clustered Index Merge применяет поток данных слияния к кластеризованному индексу. Оператор удаляет, обновляет или вставляет строки из кластеризованного индекса, заданного в столбце оператора Аргумент. Фактически выполненная операция зависит от значения столбца ACTION во время выполнения, указанного в столбце Argument оператора. Clustered Index Merge является физическим. |
|||
Clustered Index Scan |
Оператор Clustered Index Scan сканирует кластеризованный индекс, заданный в столбце Argument плана выполнения запроса. При наличии необязательного предиката WHERE:() возвращаются только строки, удовлетворяющие предикату. Если столбец Argument содержит предложение ORDERED, обработчик запросов требует, чтобы выходные данные строк были возвращены в порядке, в соответствии с которым они были отсортированы в кластеризованном индексе. Если предложение ORDERED отсутствует, подсистема хранилища выполняет поиск в индексе оптимальным способом, без обязательной сортировки выходных данных. Clustered Index Scan является логическим и физическим оператором. |
|||
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 обновляет входные строки кластеризованного индекса, указанные в столбце Argument. При наличии в столбце предиката WHERE:() обновляются только строки, удовлетворяющие условиям предиката. При наличии предиката SET:() данное значение устанавливается для каждого обновляемого столбца. При наличии предиката DEFINE:() перечисляются значения, определенные данным оператором. Ссылки на эти значения могут присутствовать в предложении SET или в любом месте внутри данного оператора либо внутри данного запроса. Clustered Index Update является логическим и физическим оператором. |
|||
Collapse |
Оператор Collapse оптимизирует процедуру обновления. При выполнении она может быть разбита (оператором Split) на операции удаления и вставки. Столбец Argument содержит предложение GROUP BY:(), указывающее список ключевых столбцов. Если обработчик запросов встречает смежные строки, удаляющие и вставляющие одни и те же значения ключей, он заменяет эти отдельные операции на одну, более эффективную операцию обновления. Collapse является логическим и физическим оператором. |
|||
Columnstore Index Scan |
Оператор Columnstore Index Scan просматривает индекс columnstore, заданный в столбце Argument плана выполнения запроса. |
|||
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 обычно используется для реализации конструкции Transact-SQL UNION ALL. Физический оператор Concatenation имеет два или более входов и один выход. Он копирует строки из первого входного потока в выходной поток и повторяет эту операцию для каждого дополнительного входного потока. Concatenation является как логическим, так и физическим оператором. |
|||
Constant Scan |
Оператор Constant Scan вводит в запрос одну или несколько константных строк. Оператор Compute Scalar часто используется после выполнения оператора Constant Scan. Он добавляет столбцы в строки, полученные в результате выполнения оператора Constant Scan. |
|||
Convert |
Оператор Convert автоматически преобразует скалярные данные из одного типа в другой. Convert является элементом языка. |
|||
Нет |
Cross Join |
Оператор Cross Join соединяет каждую строку из первого (верхнего) входного параметра с каждой строкой второго (нижнего) входного параметра. Cross Join является логическим оператором. |
||
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 является элементом языка. |
|||
Delete |
Оператор Delete удаляет те строки из объекта, которые удовлетворяют необязательному предикату в столбце Argument. |
|||
Deleted Scan |
Оператор Deleted Scan просматривает удаленную таблицу в триггере. |
|||
Нет |
Distinct |
Оператор Distinct удаляет дубликаты из набора строк или из коллекции значений. Distinct является логическим оператором. |
||
Нет |
Distinct Sort |
Логический оператор Distinct Sort просматривает входные данные, удаляя дубликаты и сортируя данные по столбцам, заданным в предикате DISTINCT ORDER BY:() столбца Argument. Distinct Sort является логическим оператором. |
||
Distribute Streams |
Оператор Distribute Streams используется только в параллельных планах запросов. Оператор Distribute Streams преобразует один входящий поток записей в несколько выходящих потоков. Формат и содержимое записей не меняются. Каждая запись из входящего потока направляется в один из выходящих потоков. Данный оператор автоматически сохраняет в выходящих потоках относительный порядок входящих записей. Чтобы определить выходящий поток, в который попадет запись из входящего потока, обычно используется хэширование. Если выход является секционированным, столбец Argument содержит предикат PARTITION COLUMNS:() и столбцы секционирования. Оператор Distribute Streams является логическим оператором. |
|||
Dynamic |
В операторе Dynamic используется курсор, который отслеживает изменения, внесенные другими. |
|||
Eager Spool |
Оператор Eager Spool принимает весь ввод, сохраняя каждую строку в скрытый временный объект базы данных tempdb. Если оператор сбрасывается на начало (например оператором Nested Loops), но при этом не требуется повторная привязка, то вместо повторного сканирования ввода используются буферизованные данные. Если требуется повторная привязка, буферизованные данные удаляются, а объект буфера перестраивается путем повторного просмотра ввода. Оператор Eager Spool строит файл буфера «жадным» способом: когда родительский оператор запрашивает первую строку, оператор spool принимает все строки своего оператора ввода и сохраняет их в буфер. Eager Spool — логический оператор. |
|||
Fetch Query |
Оператор Fetch Query извлекает строки, если выборка выполняется в курсоре. |
|||
Фильтр |
Оператор Filter просматривает входные данные и возвращает только те строки, которые удовлетворяют критерию фильтрации (предикату), представленному в столбце Argument. |
|||
Нет |
Flow Distinct |
Логический оператор Flow Distinct просматривает входные данные и удаляет дубликаты. Оператор Distinct принимает на входе все данные, чтобы выдать выходные данные, тогда как оператор FlowDistinct возвращает строки по мере поступления (если строка не является дубликатом, так как в этом случае она не возвращается). |
||
Нет |
Full Outer Join |
Логический оператор Full Outer Join возвращает каждую строку, удовлетворяющую предикату соединения из первого (верхнего) входа и соединенную с каждой строкой из второго (нижнего) входа. Он также возвращает строки из:
Вход, не содержащий совпадающих значений, возвращается как значение NULL. Full Outer Join является логическим оператором. |
||
Gather Streams |
Оператор Gather Streams используется только в планах параллельных запросов. Оператор Gather Streams считывает несколько входных потоков и создает один выходной поток записей, комбинируя все входные потоки. Формат и содержимое записей не меняются. Если этот оператор сохраняет порядок, все входные потоки должны быть упорядочены. В случае упорядоченного выхода в столбце Argument содержится предикат ORDER BY:(), а имена столбцов упорядочены. Gather Streams — логический оператор. |
|||
Hash Match |
Оператор Hash Match строит хэш-таблицу при помощи вычисления хэш-значения для каждой строки из своих входных данных. Предикат A HASH:() со списком столбцов, использованных для создания хэш-значения, отображается в столбце Argument. Затем для каждой тестовой строки (если возможно) он вычисляет хэш-значение (с использованием той же хэш-функции) и осуществляет поиск совпадений по хэш-таблице. При наличии остаточного предиката (определенного посредством предиката RESIDUAL:() в столбце Argument) строки должны удовлетворять также и этому предикату, чтобы рассматриваться в качестве совпадающих. Поведение зависит от выполняемой логической операции.
Hash Match является физическим оператором. |
|||
If |
Оператор If выполняет условную обработку в зависимости от значения выражения. If является элементом языка. |
|||
Нет |
Inner Join |
Логический оператор Inner Join возвращает каждую строку, которая удовлетворяет соединению первого (верхнего) входа со вторым (нижним). |
||
Insert |
Логический оператор Insert вставляет строки из входного потока в объект, заданный в столбце Argument. Соответствующим физическим оператором является Table Insert, Index Insert или Clustered Index Insert. |
|||
Inserted Scan |
Оператор Inserted Scan просматривает таблицу inserted. Inserted Scan является логическим и физическим оператором. |
|||
Intrinsic |
Оператор Intrinsic вызывает внутреннюю функцию Transact-SQL. Intrinsic является элементом языка. |
|||
Iterator |
Общий значок Iterator отображается в тех случаях, когда с помощью логики, управляющей графическими планами Showplan, не удается найти подходящий значок для итератора. Значок общего захвата не обязательно указывает на ошибку. Существуют три значка общего захвата: синий (итераторы), оранжевый (курсоры) и зеленый (конструкции языка Transact-SQL). |
|||
Key Lookup |
Оператор Key Lookup выполняет поиск закладок в таблице с кластеризованным индексом. Столбец Аргумент содержит имя кластеризованного индекса и ключ кластеризации, который используется для поиска строки в кластеризованном индексе. Оператор Key Lookup всегда сопровождается оператором Nested Loops. Если в столбце Аргумент присутствует предложение WITH PREFETCH, обработчик запросов определяет, что оптимальным решением при поиске закладки в таблице или кластеризованном индексе будет применение асинхронной упреждающей выборки (упреждающего чтения). Использование оператора Key Lookup в плане запроса указывает, что запрос может выиграть от настройки производительности. Например, производительность запроса можно повысить, добавив покрывающий индекс. |
|||
Keyset |
Оператор Keyset использует курсор, для которого видимыми являются обновления, но не вставки, выполненные другими. |
|||
Language Element |
Общий значок Language Element отображается в тех случаях, когда с помощью логики, управляющей графическими планами Showplan, не удается найти подходящий значок для итератора. Значок общего захвата не обязательно указывает на ошибку. Существуют три значка общего захвата: синий (итераторы), оранжевый (курсоры) и зеленый (конструкции языка Transact-SQL). |
|||
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 является логическим и физическим оператором. |
|||
Merge Interval |
Оператор Merge Interval проводит слияние нескольких (возможно, пересекающихся) интервалов и возвращает минимальный, непересекающийся интервал, который затем используется для поиска записей индекса. Этот оператор обычно проводит слияние интервалов (представленных в виде столбцов строки), сформированных при выполнении одного или нескольких операторов Compute Scalar над операторами Constant Scan. Merge Interval является логическим и физическим оператором. |
|||
Merge Join |
Оператор Merge Join выполняет внутреннее соединение, левое внешнее соединение, левое полусоединение, левое антиполусоединение, правое внешнее соединение, правое полусоединение, правое антиполусоединение, а также логические операции соединения. В столбце Argument оператор Merge Join содержит предикат MERGE:(), если операция устанавливает соединение «один ко многим», или предикат MANY-TO-MANY MERGE:(), если операция устанавливает соединение «многие ко многим». Столбец Argument содержит также список столбцов, используемых для выполнения операции с разделителями-запятыми. Оператор Merge Join требует наличия двух входных значений, отсортированных в соответствующих столбцах, что можно сделать с помощью вставки явных операций сортировки в план запроса. Соединение слиянием особенно эффективно в случаях, когда явной сортировки не требуется, например, когда в базе данных имеется подходящий индекс сбалансированного дерева или когда порядок сортировки может использоваться для нескольких операций вроде соединения слиянием или группирования со сведением. Merge Join является физическим. |
|||
Nested Loops |
Оператор Nested Loops выполняет логические операции внутреннего соединения, левого внешнего соединения, левого полусоединения и антилевого полусоединения. Операции соединения вложенных циклов выполняют поиск во внутренней таблице для каждой строки внешней таблицы, обычно используя индекс. Опираясь на предполагаемые затраты, обработчик запросов решает вопрос о необходимости сортировки внешней таблицы, чтобы ограничить область поиска по индексу во внутренней таблице. Возвращается результат выполнения логической операции над любыми строками, удовлетворяющими необязательному предикату в столбце Argument. Nested Loops является физическим оператором. |
|||
Nonclustered Index Delete |
Оператор Nonclustered Index Delete удаляет входные строки из некластеризованного индекса, указанного в столбце Argument. Nonclustered Index Delete является физическим оператором. |
|||
Index Insert |
Оператор Index Insert вставляет строки из входного потока в некластеризованный индекс, заданный в столбце Argument. В столбце Argument также содержится предикат SET:(), который указывает значение, устанавливаемое для каждого столбца. Index Insert является физическим оператором. |
|||
Index Scan |
Оператор Index Scan получает все записи некластеризованного индекса, указанного в столбце Argument. Если в столбце Argument присутствует необязательный предикат WHERE:(), то возвращаются только те строки, которые удовлетворяют условию, указанному в этом предикате. Index Scan является логическим и физическим оператором. |
|||
Index Seek |
Оператор Index Seek использует возможности поиска по индексам для получения строк из некластеризованного индекса. Столбец Argument содержит имя используемого некластеризованного индекса. Он также содержит предикат SEEK:(). Подсистема хранилища использует этот индекс для обработки только строк, удовлетворяющих предикату SEEK:(). При необходимости может включаться предикат WHERE:(), в котором подсистема хранилища вычисляет выражение для всех строк, удовлетворяющих предикату SEEK:() (при этом не используются индексы). Если столбец Argument содержит предложение ORDERED, обработчик запросов определяет, что строки должны возвращаться в том порядке, в котором они отсортированы в некластеризованном индексе. Если предложение ORDERED отсутствует, подсистема хранилища производит поиск индекса оптимальным способом (что не гарантирует сортировки выходных данных). Сохранение сортировки в выводе может оказаться менее эффективным, чем возврат неупорядоченного вывода. Index Seek является логическим и физическим оператором. |
|||
Index Spool |
Физический оператор Index Spool содержит предикат SEEK:() в столбце Argument. Оператор Index Spool сканирует входные строки, помещая каждую строку в скрытый файл буфера (хранимый в базе данных tempdb и существующий только в течение выполнения запроса), и создает для строк некластеризованный индекс. Это позволяет использовать поддерживаемый индексами механизм поиска для вывода только строк, отвечающих требованиям предиката SEEK:(). Если оператор сбрасывается на начало (например оператором Nested Loops), но при этом не требуется повторная привязка, то вместо повторного сканирования ввода используются буферизованные данные. |
|||
Nonclustered Index Update |
Физический оператор Nonclustered Index Update обновляет строки, указанные во входных параметрах, в некластеризованном индексе, заданном в столбце Argument. При наличии предиката SET:() данное значение устанавливается для каждого обновляемого столбца. Nonclustered Index Update является физическим оператором. |
|||
Online Index Insert |
Физический оператор Online Index Insert указывает, что операции создания, изменения и удаления индекса выполняются в сети. То есть данные базовых таблиц по-прежнему доступны для пользователей во время операции с индексом. |
|||
Нет |
Parallelism |
Оператор Parallelism выполняет логические операции потоков распространения, сбора и повторного секционирования. Столбцы Argument могут также содержать предикат PARTITION COLUMNS:() со списком секционируемых столбцов, разделенным запятыми. Столбцы Argument могут также содержать предикат ORDER BY:(), содержащий список столбцов для сохранения порядка сортировки во время секционирования. Parallelism является физическим оператором.
|
||
Parameter Table Scan |
Оператор Parameter Table Scan просматривает таблицу, переданную как параметр текущего запроса. Обычно он применяется для запросов INSERT из хранимой процедуры. Parameter Table Scan является логическим и физическим оператором. |
|||
Нет |
Partial Aggregate |
Оператор Partial Aggregate используется в параллельных планах. Он применяется в статистической функции к максимальному числу входных строк, чтобы избежать записи на диск (сброса на диск). Hash Match —— это единственный физический оператор (итератор), реализующий статистическую обработку секций. Partial Aggregate является логическим оператором. |
||
Population Query |
Оператор Population Query заполняет рабочую таблицу курсора при его открытии. |
|||
Refresh Query |
Оператор Refresh Query выбирает текущие данные для строк из буфера выборки. |
|||
Remote Delete |
Оператор Remote Delete удаляет входные строки удаленного объекта. Remote Delete является логическим и физическим оператором. |
|||
Remote Index Scan |
Оператор Remote Index Scan просматривает удаленный индекс, указанный в столбце Argument. Remote Index Scan является логическим и физическим оператором. |
|||
Remote Index Seek |
Оператор Remote Index Seek использует возможности поиска объекта удаленного индекса, чтобы получить строки. Столбец Argument содержит имя используемого удаленного индекса и предикат SEEK:(). Remote Index Seek является логическим физическим оператором. |
|||
Remote Insert |
Оператор Remote Insert вставляет входные строки в удаленный объект. Remote Insert является логическим и физическим оператором. |
|||
Remote Query |
Оператор Remote Query отправляет запрос удаленному источнику. Текст запроса, отправленного удаленному серверу, выводится в столбце Argument. Remote Query является логическим и физическим оператором. |
|||
Remote Scan |
Оператор Remote Scan позволяет удаленно просматривать необходимые объекты. Имя удаленного объекта появляется в столбце Argument. Remote Scan является логическим и физическим оператором. |
|||
Remote Update |
Оператор Remote Update обновляет входные строки удаленного объекта. Remote Update является логическим и физическим оператором. |
|||
Repartition Streams |
Оператор Repartition Streams собирает несколько потоков и создает несколько потоков записей. Формат и содержимое записей не меняются. Если оптимизатор запросов использует фильтр по битовым картам, то число строк в выходном потоке сокращается. Каждая запись из входного потока помещается в один выходной поток. Если оператор настроен для сохранения порядка, то все входные потоки упорядочиваются и сливаются в несколько упорядоченных выходных потоков. Если выход является секционированным, столбец Argument содержит предикат PARTITION COLUMNS:() и столбцы секционирования. В случае упорядоченного выхода в столбце Argument содержится предикат ORDER BY:() и упорядочиваемые столбцы. Repartition Streams — это логический оператор. Он используется только в параллельных планах запроса. |
|||
Result |
Оператор Result представляет собой данные, возвращенные в конце плана запроса. Обычно он является корневым элементом инструкции Showplan. Result является элементом языка. |
|||
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 просматривает входные данные, подсчитывая число представленных строк и возвращая такое же количество строк, очищенных от данных. Этот оператор используется, когда необходимо проверить существование строк, а не наличие в них данных. Например, если оператор Nested Loops выполняет операцию левого полусоединения, а предикат соединения применяется к внутренним входным данным, оператор Row Count Spool можно разместить выше внутреннего ввода оператора Nested Loops. Тогда оператор Nested Loops может определить количество выходных строк оператора Row Count Spool (поскольку реальные данные с внутренней стороны не требуются) для определения того, нужно ли возвращать внешние строки. Оператор Row Count Spool — это физический оператор. |
|||
Segment |
Segment является физическим и логическим оператором. Он делит входной набор на сегменты в соответствии со значением одного или нескольких столбцов. Эти столбцы отображаются в виде аргументов оператора Segment. Затем оператор выводит по одному сегменту за раз. |
|||
Нет |
Segment Repartition |
В плане параллельных запросов иногда содержатся концептуальные области итераторов. Все итераторы в рамках такой области могут обрабатываться параллельными потоками. Сами же области должны обрабатываться последовательно. Некоторые итераторы оператора Parallelism внутри отдельной области называются Branch Repartition. Итератор оператора Parallelism на границе двух таких областей называется Segment Repartition. Branch Repartition и Segment Repartition являются логическими операторами. |
||
Sequence |
Оператор Sequence выполняет планы широкого обновления. Практически он выполняет каждый вход по очереди (сверху вниз). Каждый вход обычно является обновлением отдельного объекта. Он возвращает лишь строки, полученные из последнего (нижнего) входа. Оператор Sequence является логическим и физическим оператором. |
|||
Sequence Project |
Оператор Sequence Project добавляет столбцы для выполнения вычислений над упорядоченным набором. Он делит входной набор на сегменты в соответствии со значением одного или нескольких столбцов. Затем оператор выводит по одному сегменту за раз. Эти столбцы отображаются как аргументы оператора Sequence Project. Sequence Project является логическим и физическим оператором. |
|||
Моментальный снимок |
Оператор Snapshot создает курсор, который не видит изменений, сделанных другими курсорами. |
|||
Sort |
Оператор Sort сортирует входящие строки. Столбец Аргумент содержит либо предикат DISTINCT ORDER BY:(), если в этой операции удаляются дубликаты, либо предикат ORDER BY:() с разделенным запятыми списком сортируемых столбцов. Столбцы имеют префикс со значением ASC, если они сортируются по возрастанию, или значением DESC, если сортируются по убыванию. Sort — это логический и физический оператор. |
|||
Split |
Оператор Split используется для оптимизации процесса обновления. Он разбивает каждую операцию обновления на операции удаления и вставки. Оператор Split является логическим и физическим оператором. |
|||
Spool |
Оператор Spool сохраняет промежуточные результаты запроса в базе данных tempdb. |
|||
Stream Aggregate |
Оператор Stream Aggregate группирует строки в один или несколько столбцов и вычисляет одно или несколько агрегатных выражений, возвращенных запросом. Выход этого оператора может быть использован последующими операторами запроса, возвращен клиенту или то и другое. Оператору Stream Aggregate необходимы входные данные, упорядоченные по группируемым столбцам. Оптимизатор использует перед этим оператором оператор Sort, если данные не были ранее отсортированы оператором Sort или используется упорядоченный поиск или просмотр в индексе. В инструкции SHOWPLAN_ALL или графическом плане выполнения в среде Среда SQL Server Management Studio столбцы в предикате GROUP BY перечисляются в столбце Argument, а агрегатное выражения — в столбце Defined Values. Stream Aggregate является физическим оператором. |
|||
Параметр |
Оператор Switch представляет собой особый тип итератора объединения, который имеет n входов. Выражение связывается с каждым оператором Switch. В зависимости от возвращаемого значения выражения (между 0 и n-1) оператор Switch копирует соответствующий входной поток в выходной поток. В частности, оператор Switch применяется при реализации планов запроса, содержащих быстрые курсоры прямого направления с такими операторами, как TOP. Switch является и логическим, и физическим оператором. |
|||
Table Delete |
Физический оператор Table Delete удаляет строки из таблицы, указанной в столбце Аргумент плана выполнения запроса. |
|||
Table Insert |
Оператор Table Insert вставляет строки из своих входных данных в таблицу, указанную в столбце Argument плана выполнения запроса. В столбце Argument также содержится предикат SET:(), который указывает значение, устанавливаемое для каждого столбца. Если оператор Table Insert не имеет потомков для вставки значений, то вставленная строка берется из самого оператора вставки. Table Insert является физическим оператором. |
|||
Table Merge |
Оператор Table Merge применяет поток данных слияния к куче. Оператор удаляет, обновляет или вставляет строки в таблицу, указанную в столбце Argument оператора. Тип выполненной операции зависит от значения времени выполнения столбца ACTION, указанного в столбце Argument оператора. Table Merge является физическим оператором. |
|||
Table Scan |
Оператор Table Scan получает строки из таблицы, указанной в столбце Аргумент плана выполнения запроса. Если предикат WHERE:() присутствует в столбце Argument, возвращаются только строки, удовлетворяющие условию, указанному в этом предикате. Table Scan является логическим и физическим оператором. |
|||
Table Spool |
Оператор Table Spool просматривает входную таблицу и помещает копию каждой строки в скрытую буферную таблицу, которая находится в базе данных tempdb и существует только в течение времени жизни запроса. Если оператор сбрасывается на начало (например оператором Nested Loops), но при этом не требуется повторная привязка, то вместо повторного сканирования ввода используются буферизованные данные. Table Spool является физическим оператором. |
|||
Table Update |
Физический оператор Table Update обновляет входные строки в таблице, указанной в столбце Аргумент плана выполнения запроса. Предикат SET:() определяет значение для каждого обновляемого столбца. Эти значения могут быть упомянуты в предложении SET или в другом месте в этом операторе, а также в каком-либо другом месте в рамках запроса. |
|||
Table-valued Function |
Оператор Table-valued Function вычисляет функцию с табличным значением (языка Transact-SQL или среды CLR) и сохраняет строки результата в базе данных tempdb. Когда родительские итераторы запрашивают эти строки, оператор Table-valued Function возвращает эти строки из базы данных tempdb. Запросы, вызывающие функции с табличным значением, формируют планы запросов с итератором Table-valued Function. Функция с табличным значением может вычисляться с различными значениями параметров:
Оператор Table-valued Function — это логический и физический оператор. |
|||
В начало |
Оператор Top просматривает входные данные и возвращает только указанное число или процент строк, выбранных, возможно, на основе порядка сортировки. Столбец Аргумент может содержать список столбцов, которые проверяются на наличие связей. Планируется использовать оператор Top для соблюдения ограничений на число строк. Top — это логический и физический оператор. Top — это логический и физический оператор. |
|||
Нет |
Top N Sort |
Оператор Top N Sort аналогичен итератору Sort за исключением того, что использует только первые N строк, а не весь результирующий набор. Для небольших значений N ядро выполнения запросов SQL Server пытается выполнить операцию сортировки полностью в памяти. Для больших значений N ядро выполнения запросов использует более общий способ сортировки, в котором N не является параметром. |
||
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 |
Оператор Update обновляет каждую строку, начиная с ее ввода в объект, указанный в столбце Argument плана выполнения запроса. Update является логическим оператором. Операторы Table Update, Index Update или Clustered Index Update являются физическими. |
|||
While |
Оператор While реализует цикл while языка Transact-SQL. While является элементом языка. |
|||
Window Spool |
Оператор Window Spool расширяет каждую строку в набор строк, представляющий связанное с ним окно. В запросе предложение OVER определяет окно в наборе результатов запроса, а оконная функция затем вычисляет значения для каждой строки в окне. Window Spool является логическим и физическим оператором. |