Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Операторы описывают, как SQL Server выполняет запрос или инструкцию языка обработки данных (DML). Оптимизатор запросов использует операторы для построения плана запроса, чтобы создать результат, заданный в запросе, или произвести операцию, указанную в инструкции DML. План запроса — это дерево физических операторов. План запроса можно просмотреть с помощью инструкций SET SHOWPLAN, параметров отображения плана выполнения в SQL Server Management Studio или классов событий Showplan в SQL Server Profiler.
Операторы классифицируются как логические и физические.
Логические операторы
Логические операторы описывают операции реляционной алгебры, используемые для обработки инструкции. Другими словами, логические операторы описывают на концептуальном уровне, какие действия следует совершить.
Физические операторы
Физические операторы реализуют действия, описанные логическими операторами. Каждый физический оператор является объектом или процедурой, выполняющей операцию. Например, некоторые физические операторы обращаются к столбцам и строкам таблицы, индекса или представления. Другие физические операторы выполняют другие операции, такие как, например, вычисления, агрегации, проверки целостности данных или соединения. Физическим операторам соответствует их стоимость.
Физические операторы производят инициализацию, собирают данные и закрываются. Если формулировать более конкретно, физический оператор может ответить на вызов трех следующих методов.
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 равно нулю. Если оператор находится на внутренней стороне циклического соединения, сумма количества повторной привязки и перемоток должна быть равна количеству строк, обработанных на внешней стороне соединения. Повторная привязка значит, что изменился один и более связанный параметр соединения, и внутреннюю часть нужно пересчитать. Перемотка означает, что ни один из сопоставленных параметров не изменился, а предыдущий внутренний результирующий набор может использоваться повторно.
Фактическиеrebinds и ActualRewinds представлены в выходных данных XML Showplan, созданных с помощью SET STATISTICS XML ON. Они заполняются только для операторов Некластеризованная индексация, Remote Query, Счетчик строк, Sort, Табличная выгрузка и Табличная функция.
ActualRebinds и ActualRewinds также могут быть заполнены для операторов Assert и Filter, если атрибут StartupExpression установлен в значение TRUE.
Если в XML Showplan присутствуют фактические Rebinds и фактические Rewinds , они сравниваются с EstimateRebinds и EstimateRewinds. Если они отсутствуют, предполагаемое количество строк (EstimateRows) сравнимо с фактическим числом строк (ActualRows). Обратите внимание, что фактический графический вывод Showplan отображает нули для фактических rebinds и rewinds, если они отсутствуют.
Связанный счетчик ActualEndOfScans доступен только в том случае, если выходные данные Showplan создаются с помощью SET STATISTICS XML ON. Каждый раз, когда физический оператор достигает конца потока данных, этот счетчик увеличивается на единицу. Физический оператор может достигать конца своего потока данных ни одного, один или несколько раз. Как и при повторной привязке и перемотках, количество окончаний сканирования может быть более чем один, только если оператор расположен на внутренней стороне соединения цикла. Число концов сканирования должно быть меньше или равно сумме количества перепривязок и перемоток.
Сопоставление физических и логических операторов
Оптимизатор запросов создает план запроса в виде дерева, состоящего из логических операторов. После создания плана оптимизатор запросов выбирает наиболее эффективный физический оператор для каждого логического оператора. Оптимизатор запросов использует подход на основе затрат, чтобы определить, какой физический оператор будет реализовывать логический оператор.
Обычно логическую операцию можно реализовать с помощью нескольких физических операторов. Однако в редких случаях физический оператор может реализовывать несколько логических операций.
Описания операторов
Этот раздел содержит описания логических и физических операторов.
| Значок графического плана выполнения | Оператор Showplan | Описание |
|---|---|---|
| Отсутствует | Aggregate |
Оператор Aggregate вычисляет выражение, содержащее MIN, MAX, SUM, COUNT или AVG. Оператор Aggregate может быть логическим оператором или физическим оператором. |
|
Arithmetic Expression |
Оператор Arithmetic Expression вычисляет новое значение из существующих значений в строке.
Arithmetic Expression не используется в SQL Server 2014. |
|
Assert |
Оператор Assert проверяет условие. Например, этот оператор проверяет целостность ссылок или гарантирует, что скалярный вложенный запрос возвращает одну строку. Для каждой входной строки Assert оператор вычисляет выражение в Argument столбце плана выполнения. Если это выражение оценивается как NULL, строка передается оператором Assert , а выполнение запроса продолжается. Если это выражение оценивается как ненулевое значение, возникает соответствующая ошибка. Оператор Assert является физическим оператором. |
|
Assign |
Оператор Assign назначает значение выражения или константы переменной.
Assign — это элемент языка. |
| Отсутствует | Asnyc Concat |
Оператор Asnyc Concat используется только в удаленных запросах (распределенных запросах). Он имеет n дочерних узлов и один родительский узел. Обычно некоторые дочерние узлы являются удаленными компьютерами, участвующими в распределенном запросе.
Asnyc Concat совершает вызовы ко всем дочерним элементам одновременно, а затем применяет битовое изображение к каждому дочернему элементу. Для каждого бита, который является 1, Async Concat отправляет выходные строки на родительский узел по запросу. |
|
Bitmap |
SQL Server использует Bitmap оператор для реализации фильтрации растровых карт в параллельных планах запросов. Фильтрация битовой карты ускоряет выполнение запроса, устраняя строки, содержащие ключи, которые не могут создавать записи соединения перед передачей через другой оператор, такой как оператор Parallelism. Фильтр по битовым картам использует компактное представление набора значений из таблицы, находящейся в одной части дерева операторов, для фильтрации строк из другой таблицы, находящейся в другой части дерева. Если сразу удалять ненужные строки в запросе, последующие операторы работают с меньшим количеством строк, тем самым повышая общую производительность. Оптимизатор определяет, достаточно ли избирательна битовая маска, чтобы быть полезной, и в каких операторах применить фильтр.
Bitmap — это физический оператор. |
|
Bitmap Create |
Оператор Bitmap Create отображается в выходных данных Showplan, где создаются растровые изображения.
Bitmap Create — логический оператор. |
|
Bookmark Lookup |
Оператор Bookmark Lookup использует закладку (идентификатор строки или ключ кластеризации) для поиска соответствующей строки в таблице или кластеризованном индексе. Столбец Argument содержит метку закладки, используемую для поиска строки в таблице или кластеризованном индексе. Столбец Argument также содержит имя таблицы или кластеризованного индекса, в котором выполняется поиск строки. Если предложение WITH PREFETCH отображается в Argument столбце, обработчик запросов определил, что при поиске закладок в таблице или кластеризованном индексе оптимально использовать асинхронную предвыборку (считывание вперёд).Bookmark Lookup не используется в SQL Server 2014. Вместо этого 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 |
Указывает создание хэш-таблицы для пакета оптимизированного индекса колонок памяти xVelocity. |
| Отсутствует | Cache |
Cache — это специализированная версия оператора Spool . Он хранит только одну строку данных.
Cache — логический оператор.
Cache не используется в SQL Server 2014. |
|
Clustered Index Delete |
Оператор Clustered Index Delete удаляет строки из кластеризованного индекса, указанного в столбце "Аргумент" плана выполнения запроса. Если предикат WHERE:() присутствует в столбце аргументов, удаляются только те строки, которые удовлетворяют предикату.
Clustered Index Delete — это физический оператор. |
|
Clustered Index Insert |
Оператор Clustered Index Insert Showplan вставляет строки из входных данных в кластеризованный индекс, указанный в столбце "Аргумент". Столбец аргументов также содержит предикат SET:(), указывающий значение, для которого задан каждый столбец. Если Clustered Index Insert нет дочерних значений для вставки значений Insert , строка, вставленная из самого оператора.
Clustered Index Insert — это физический оператор. |
|
Объединение кластеризованных индексов | Оператор Clustered Index Merge применяет поток данных слияния к кластеризованному индексу. Оператор удаляет, обновляет или вставляет строки из кластеризованного индекса, указанного в Argument столбце оператора. Фактическая операция зависит от значения среды выполнения столбца ACTION , указанного в Argument столбце оператора.
Clustered Index Merge является физическим. |
диспетчера |
Clustered Index Scan |
Оператор Clustered Index Scan сканирует кластеризованный индекс, указанный в столбце "Аргумент" плана выполнения запроса. Если необязательный предикат WHERE:() присутствует, возвращаются только те строки, которые удовлетворяют предикату. Если столбец "Аргумент" содержит предложение ORDER, обработчик запросов запросил возврат выходных данных строк в том порядке, в котором кластеризованный индекс отсортировал его. Если предложение ORDER отсутствует, подсистема хранилища сканирует индекс оптимальным образом без обязательной сортировки выходных данных.
Clustered Index Scan — это логический и физический оператор. |
|
Clustered Index Seek |
Оператор Clustered Index Seek использует возможность поиска индексов для получения строк из кластеризованного индекса. Столбец Argument содержит имя используемого кластеризованного индекса и предиката SEEK:(). Подсистема хранилища использует индекс для обработки только тех строк, которые удовлетворяют этому предикату SEEK:(). Он также может включать предикат WHERE:(), где подсистема хранилища оценивается по всем строкам, удовлетворяющим предикату SEEK:(), но это необязательно и не использует индексы для выполнения этого процесса.Argument Если столбец содержит предложение ORDER, обработчик запросов определил, что строки должны быть возвращены в порядке, в котором кластеризованный индекс сортировал их. Если предложение ORDER отсутствует, подсистема хранилища выполняет поиск индекса оптимальным способом без обязательной сортировки выходных данных. Разрешение выходных данных сохранять порядок может быть менее эффективным, чем производство неортированных выходных данных. При появлении ключевого слова 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 Операторы, которые появляются в "Showplans", созданных с использованием SET STATISTICS XML, могут не содержать элемент RunTimeInformation. В графических планах выполнения фактические строки, фактические привязки и фактические перемотки могут отсутствовать в окне "Свойства", если выбран параметр "Включить фактический план выполнения" в SQL Server Management Studio. Когда это происходит, это означает, что хотя эти операторы использовались в скомпилированном плане запроса, их работа выполнялась другими операторами в плане запросов во время выполнения. Кроме того, обратите внимание, что количество выполнений в результатах Showplan, созданных с помощью SET STATISTICS PROFILE, эквивалентно сумме перезапусков и перемоток в Showplans, созданных с помощью SET STATISTICS XML. |
оператора |
Конкатенация | Оператор 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 |
Значок резервный отображается, когда логика, создающая графические планировки, не может найти подходящий значок для итератора. Значок общего назначения не обязательно означает наличие ошибки. Существует три значка catchall: синий (для итераторов), оранжевый (для курсоров) и зеленый (для элементов языка Transact-SQL). |
| Отсутствует | Курсор | Логический и физический операторы Cursor предназначены для описания того, каким образом выполняются операции запроса или обновления с участием курсора. Физические операторы описывают алгоритм физической реализации обработки курсора, например использование курсора, управляемого набором ключей. Каждый шаг выполнения курсора соответствует физическому оператору. Логические операторы описывают свойства курсора, например доступность курсора только для чтения. Логические операторы включают асинхронные, оптимистические, первичные, только для чтения, блокировки прокрутки, вторичные и синхронные. Физические операторы включают динамический, запрос получения, набор ключей, запрос на заполнение, обновление запроса и моментальный снимок. |
|
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 преобразует один входящий поток записей в несколько выходящих потоков. Содержимое записи и формат не изменяются. Каждая запись из входящего потока направляется в один из выходящих потоков. Данный оператор автоматически сохраняет в выходящих потоках относительный порядок входящих записей. Чтобы определить выходящий поток, в который попадет запись из входящего потока, обычно используется хэширование. Если выходные данные секционированы, Argument столбец содержит предикат PARTITION COLUMNS:() и столбцы секционирования. ОператорDistribute Streams является логическим оператором. |
|
Dynamic |
Оператор Dynamic использует курсор, который может видеть все изменения, внесенные другими пользователями. |
|
Ускоренная катушка | Оператор Жадного Spool получает все входные данные, сохраняя каждую строку в скрытом временном объекте, хранящемся в tempdb базе данных. Если оператор перематывается (например, оператором Nested Loops), но повторная привязка не требуется, вместо повторного сканирования входных данных используются буферизованные данные. Если требуется повторная привязка, буферизованные данные удаляются, а объект буфера перестраивается путем повторного просмотра ввода. Оператор Eager Spool выполняет построение своего буферного файла «жадным» способом: когда родительский оператор буфера запрашивает первую строку, оператор буферизации принимает все строки из своего входного оператора и сохраняет ее в буфер.
Eager Spool — логический оператор. |
|
Fetch Query |
Оператор Fetch Query извлекает строки, когда осуществляется выборка из курсора. |
|
Фильтр | Оператор фильтра сканирует входные данные, возвращая только те строки, которые удовлетворяют выражению фильтра (предикату), который отображается в столбце Argument . |
| Отсутствует | Flow Distinct |
Логический Flow Distinct оператор сканирует входные данные, удаляя дубликаты.
Distinct В то время как оператор использует все входные данные перед созданием каких-либо выходных данных, оператор FlowDistinct возвращает каждую строку, полученную из входных данных (если эта строка не является дубликатом, в этом случае она будет отменена). |
| Отсутствует | Full Outer Join |
Логический Full Outer Join оператор возвращает каждую строку, удовлетворяющую предикату соединения из первого (верхнего) входного элемента, присоединенного к каждой строке из второго (нижнего) входного элемента. Он также возвращает строки из:-Первый ввод, который не имел совпадений со вторым вводом. -Второй вход, не соответствующий первому входу. Входные данные, не содержащие соответствующие значения, возвращаются в качестве значения NULL. Full Outer Join — логический оператор. |
|
Сбор потоков | Оператор Gather Streams используется только в планах параллельных запросов. Оператор Gather Streams считывает несколько входных потоков и создает один выходной поток записей, комбинируя все входные потоки. Содержимое записи и формат не изменяются. Если этот оператор сохраняет порядок, все входные потоки должны быть упорядочены. Если выходные данные упорядочены, Argument столбец содержит предикат ORDER BY:() и имена упорядоченных столбцов.
Gather Streams — логический оператор. |
|
Hash Match |
Оператор Hash Match создает хэш-таблицу путем вычисления хэш-значения для каждой строки из входных данных сборки. Предикат 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 является логическим и физическим оператором. |
|
Intrinsic |
Оператор Intrinsic вызывает внутреннюю функцию Transact-SQL.
Intrinsic — это элемент языка. |
|
Iterator |
Значок Iterator catchall отображается, когда подходящий значок для итератора не удается найти логикой, которая создает графические планы Showplans. Значок catchall не обязательно указывает на наличие ошибки. Существует три значка catchall: синий (для итераторов), оранжевый (для курсоров) и зеленый (для конструкций языка Transact-SQL). |
|
Key Lookup |
Оператор Key Lookup — это поиск закладок в таблице с кластеризованным индексом. Столбец Argument содержит имя кластеризованного индекса и ключ кластеризации, используемый для поиска строки в кластеризованном индексе.
Key Lookup всегда сопровождается оператором Nested Loops . Если предложение WITH PREFETCH появляется в Argument столбце, обработчик запросов определил, что при поиске закладок в кластеризованном индексе оптимально использовать асинхронную предварительную выборку (чтение вперёд).Использование оператора Key Lookup в плане запроса указывает на то, что запрос может потребовать настройки производительности. Например, производительность запроса можно повысить, добавив покрывающий индекс. |
|
Keyset |
Оператор Keyset использует курсор, который может видеть обновления, но не вставки, сделанные другими пользователями. |
|
Language Element |
Значок для общего случая Language Element отображается, когда подходящего значка для итератора не удается найти с помощью логики, создающей Showplans в графическом формате. Значок catchall не обязательно указывает условие ошибки. Существует три значка catchall: синий (для итераторов), оранжевый (для курсоров) и зеленый (для конструкций языка Transact-SQL). |
|
Ленивый Спул |
Логический оператор Lazy Spool сохраняет каждую строку из входных данных в скрытый временный объект, хранящийся в tempdb базе данных. Если оператор возвращается в исходное состояние (например, оператором Nested Loops), но повторная привязка не требуется, то вместо повторного сканирования входных данных используются буферизованные данные. Если требуется повторная привязка, буферизованные данные удаляются, а объект буфера перестраивается путем повторного просмотра ввода. Оператор Lazy Spool производит отложенное построение своего буферного файла: каждый раз, когда родительский оператор буфера запрашивает строку, оператор буферизации получает строку из своего входного оператора и сохраняет ее в буфер, а не обрабатывает все строки сразу. Ленивый 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 выполняет внутреннее соединение, левое внешнее соединение, левое полусоединение, левое антиполусоединение, правое внешнее соединение, правое полусоединение, правое антиполусоединение, а также логические операции соединения. В столбце Argument оператор Объединение слиянием содержит предикат MERGE:(), если операция выполняет соединение «один ко многим», или предикат MANY-TO-MANY MERGE:(), если операция выполняет соединение «многие ко многим». Столбец Argument также содержит разделенный запятыми список столбцов, используемых для выполнения операции. Оператор Merge Join требует наличия двух входных значений, отсортированных в соответствующих столбцах, что можно сделать с помощью вставки явных операций сортировки в план запроса. Объединение слиянием особенно эффективно, если явное сортировка не требуется, например, если в базе данных есть подходящий индекс дерева B или порядок сортировки можно использовать для нескольких операций, таких как объединение слиянием и группирование с свертыванием.
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 . Если необязательный предикат WHERE:() отображается в Argument столбце, возвращаются только те строки, которые удовлетворяют предикату.
Index Scan — это логический и физический оператор. |
Значок |
Index Seek |
Оператор Index Seek использует возможность поиска индексов для получения строк из некластеризованного индекса. Столбец Argument содержит имя используемого некластеризованного индекса. Он также содержит предикат SEEK:(). Подсистема хранилища использует индекс для обработки только тех строк, которые удовлетворяют предикату SEEK:(). При необходимости он может включать предикат WHERE:(), который подсистема хранилища будет оценивать по всем строкам, удовлетворяющим предикату SEEK:() (он не использует индексы для этого).
Argument Если столбец содержит предложение ORDER, обработчик запросов определил, что строки должны быть возвращены в порядке, в котором некластеризованный индекс сортировал их. Если предложение ORDER отсутствует, подсистема хранилища выполняет поиск индекса оптимальным способом (что не гарантирует, что выходные данные будут отсортированы). Сохранение порядка выходных данных может быть менее эффективным, чем создание несортированных выходных данных.
Index Seek — это логический и физический оператор. |
|
Индекс Spool | Физический оператор Index Spool содержит предикат SEEK:() в столбце Argument . Оператор Индекса Spool сканирует входные строки, помещает копию каждой строки в скрытый файл спула (хранящийся в tempdb базе данных и существующий только в течение всего времени существования запроса) и создает некластеризованный индекс на строках. Это позволяет использовать возможность поиска индексов для вывода только тех строк, которые удовлетворяют предикату SEEK:(). Если оператор перематывается (например, оператором Nested Loops), но повторное связывание не требуется, то вместо повторного сканирования входных данных используются буферизованные данные. |
|
Nonclustered Index Update |
Физический Nonclustered Index Update оператор обновляет строки из входных данных в некластеризованном индексе, указанном в столбце Argument . Если предикат SET:() присутствует, для каждого обновленного столбца задано это значение.
Nonclustered Index Update — это физический оператор. |
индекса |
Вставка индекса в сети | Физический оператор "Вставка индекса в Сети " указывает, что операция создания, изменения или удаления индекса выполняется в сети. То есть данные базовых таблиц по-прежнему доступны для пользователей во время операции с индексом. |
| Отсутствует | Parallelism |
Оператор Parallelism выполняет логические операции распределения потоков, сбора потоков и повторного распределения потоков. Столбцы Argument могут содержать предикат PARTITION COLUMNS:() с разделенным запятыми списком секционированных столбцов. Столбцы Argument также могут содержать предикат ORDER BY:(), в котором перечислены столбцы для сохранения порядка сортировки во время секционирования.
Parallelism — это физический оператор.Примечание. Если запрос был скомпилирован как параллельный запрос, но во время выполнения он выполняется в качестве последовательного запроса, выходные данные Showplan, созданные XML-файлом SET STATISTICS, или с помощью параметра "Включить фактический план выполнения " в SQL Server Management Studio не будет содержать RunTimeInformation элемент для Parallelism оператора. В выходных данных SET STATISTICS PROFILE фактические числа строк и фактическое количество выполняемых операций будут отображать нули для Parallelism оператора. При возникновении любого условия оператор Parallelism использовался только во время компиляции запросов, а не в плане запроса во время выполнения. Обратите внимание, что иногда параллельные планы запросов выполняются последовательно, если на сервере есть высокая параллельная нагрузка. |
|
Parameter Table Scan |
Оператор Parameter Table Scan сканирует таблицу, которая выступает в качестве параметра в текущем запросе. Обычно это используется для запросов INSERT в хранимой процедуре.
Parameter Table Scan — это логический и физический оператор. |
| Отсутствует | Частичное статистическое выражение | Оператор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 Seek использует возможности поиска объекта удаленного индекса, чтобы получить строки. Столбец Argument содержит имя используемого удаленного индекса и предиката SEEK:().
Удаленный поиск индекса — это логический физический оператор. |
|
Удаленная вставка | Оператор 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 использует несколько потоков и создает несколько потоков записей. Содержимое записи и формат не изменяются. Если оптимизатор запросов использует фильтр по битовым картам, то число строк в выходном потоке сокращается. Каждая запись из входного потока помещается в один выходной поток. Если оператор настроен для сохранения порядка, то все входные потоки упорядочиваются и сливаются в несколько упорядоченных выходных потоков. Если выходные данные секционированы, Argument столбец содержит предикат PARTITION COLUMNS:() и столбцы секционирования. Если выходные данные упорядочены, Argument столбец содержит предикат ORDER BY:() и упорядоченные столбцы.
Repartition Streams — это логический оператор. Он используется только в параллельных планах запроса. |
|
Result |
Оператор Result — это данные, возвращаемые в конце плана запроса. Обычно это корневой элемент Showplan.
Result — это элемент языка. |
|
RID Lookup |
RID Lookup — это операция поиска закладки в куче по предоставленному идентификатору строки (RID). Столбец Argument содержит метку закладки, используемую для поиска строки в таблице, и имя таблицы, в которой выполняется поиск строки.
RID Lookup всегда сопровождается соединением с вложенным циклом.
RID Lookup — это физический оператор. Дополнительные сведения о поисках закладок см. в разделе "Поиск закладок" в блоге MSDN SQL Server. |
| Отсутствует | Right Anti Semi Join |
Оператор Right Anti Semi Join выводит каждую строку из второго (нижнего) ввода, если соответствующая строка в первом (верхнем) входе не существует. Соответствующая строка определяется как строка, которая удовлетворяет предикату в столбце Argument (если предикат отсутствует, каждая строка является соответствующей строкой).
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 просматривает входные данные, подсчитывая число представленных строк и возвращая такое же количество строк, очищенных от данных. Этот оператор используется, если важно проверить наличие строк, а не данных, содержащихся в строках. Например, если оператор Nested Loops выполняет операцию левого полусоединения и предикат соединения применяется к внутреннему входу, то в верхней части внутреннего входа оператора Nested Loops может быть размещен счетчик строк.
Nested Loops Затем оператор может определить, сколько строк выводится с помощью набора строк (так как фактические данные из внутренней стороны не нужны), чтобы определить, следует ли возвращать внешнюю строку. ОператорRow Count Spool — это физический оператор. |
|
Сегмент | Сегмент — это физический и логический оператор. Он делит входной набор на сегменты на основе значения одного или нескольких столбцов. Эти столбцы отображаются в виде аргументов оператора Segment . Затем оператор выводит один сегмент за раз. |
| Отсутствует | Segment Repartition |
В плане параллельных запросов иногда содержатся концептуальные области итераторов. Все итераторы в рамках такой области могут обрабатываться параллельными потоками. Сами же области должны обрабатываться последовательно. Некоторые итераторы Parallelism в отдельном регионе называются Branch Repartition. Итератор Parallelism на границе двух таких регионов называется Segment Repartition.
Branch Repartition и Segment Repartition являются логическими операторами. |
|
Sequence |
Оператор управляет масштабными Sequence планами обновления. Практически он выполняет каждый вход по очереди (сверху вниз). Каждый вход обычно является обновлением отдельного объекта. Он возвращает лишь строки, полученные из последнего (нижнего) входа.
Sequence — это логический и физический оператор. |
|
Sequence Project |
Оператор Sequence Project добавляет столбцы для выполнения вычислений по упорядоченном набору. Он делит входной набор на сегменты на основе значения одного или нескольких столбцов. Затем оператор выводит один сегмент за раз. Эти столбцы отображаются как аргументы в операторе Sequence Project .
Sequence Project — это логический и физический оператор. |
|
Моментальный снимок | Оператор моментального снимка создает курсор, который не видит изменений, внесенных другими пользователями. |
|
Sort |
Оператор Sort сортирует все входящие строки. Столбец Argument содержит предикат DISTINCT ORDER BY:(), если дубликаты удаляются этой операцией, или предикат ORDER BY:() с разделенным запятыми списка отсортированных столбцов. Столбцы префиксируются со значением ASC, если столбцы отсортированы в порядке возрастания, или значение DESC, если столбцы отсортированы в порядке убывания.
Sort — это логический и физический оператор. |
|
Split |
Оператор Split используется для оптимизации обработки обновлений. Он разбивает каждую операцию обновления на операции удаления и вставки.
Split — это логический и физический оператор. |
|
Катушка | Оператор Spool сохраняет промежуточный результат запроса в tempdb базу данных. |
|
Stream Aggregate |
Оператор Stream Aggregate группирует строки по одному или нескольким столбцам, а затем вычисляет одно или несколько статистических выражений, возвращаемых запросом. Выход этого оператора может быть использован последующими операторами запроса, возвращен клиенту или то и другое. Оператор Stream Aggregate требует ввода, упорядоченного столбцами в группах. Оптимизатор будет использовать оператор Sort перед этим оператором, если данные еще не отсортированы из-за предыдущего оператора Sort или из-за упорядоченного поиска или сканирования индекса. В инструкции SHOWPLAN_ALL или графическом плане выполнения в SQL Server Management Studio столбцы предиката GROUP BY перечислены в Argument столбце, а статистические выражения перечислены в столбце "Определенные значения ".
Stream Aggregate — это физический оператор. |
|
Переключатель | ОператорSwitch представляет собой особый тип итератора объединения, который имеет n входов. Выражение связывается с каждым оператором Switch . В зависимости от возвращаемого значения выражения (между 0 и n-1) оператор Switch копирует соответствующий входной поток в выходной поток. В частности, оператор Switch применяется при реализации планов запроса, содержащих быстрые курсоры прямого направления с такими операторами, как TOP . Переключатель — это логический и физический оператор. |
|
Table Delete |
Физический Table Delete оператор удаляет строки из таблицы, указанной в Argument столбце плана выполнения запроса. |
|
Table Insert |
Оператор Table Insert вставляет строки из входных данных в таблицу, указанную в Argument столбце плана выполнения запроса. Столбец Argument также содержит предикат SET:(), указывающий значение, для которого задан каждый столбец. Если у Table Insert нет дочерних элементов для вставки значений, то строка вставляется из самого оператора Insert.
Table Insert — это физический оператор. |
|
Слияние таблиц | Оператор Table Merge применяет поток данных слияния к куче. Оператор удаляет, обновляет или вставляет строки в таблицу, указанную в Argument столбце оператора. Фактическая операция зависит от значения времени выполнения столбца ACTION , указанного в Argument столбце оператора.
Table Merge является физическим оператором. |
|
Table Scan |
Оператор Table Scan извлекает все строки из таблицы, указанной в Argument столбце плана выполнения запроса. Если предикат WHERE:() отображается в столбце Argument , возвращаются только те строки, которые удовлетворяют предикату.
Table Scan — это логический и физический оператор. |
|
Таблица Spool | Оператор Spool таблицы сканирует входные данные и помещает копию каждой строки в скрытую таблицу spool, хранящуюся в базе данных tempdb и существующую только в течение времени существования запроса. Если оператор перематывается (например, оператором Nested Loops ), но повторное связывание не требуется, то вместо повторного сканирования входных данных используются собранные данные.
Table Spool является физическим оператором. |
|
Table Update |
Физический Table Update оператор обновляет входные строки в таблице, указанной в Argument столбце плана выполнения запроса. Предикат SET:() определяет значение каждого обновленного столбца. Эти значения могут ссылаться в предложении SET или в другом месте этого оператора, а также в другом месте этого запроса. |
|
Функция с табличным значением | Оператор функции с табличным значением вычисляет функцию (либо Transact-SQL, либо CLR) с табличным значением и сохраняет результирующие строки в базе данных tempdb. Когда родительские итераторы запрашивают строки, функция с табличным значением возвращает строки из tempdb.Запросы, вызывающие функции с табличным значением, формируют планы запросов с итератором Table-valued Function . Функция с табличным значением может вычисляться с различными значениями параметров: Читатель XML с табличным значением функции принимает XML-BLOB-объект в качестве параметра и создает набор строк, представляющий узлы XML в порядке XML-документа. Другие входные параметры могут ограничить узлы XML, возвращаемые в подмножество XML-документа. Средство чтения XML с табличным значением функции с фильтром XPath — это специальный тип функции чтения с табличным значением XML, которая ограничивает выходные данные узлам XML, удовлетворяющим выражению XPath. ОператорTable-valued Function — это логический и физический оператор. |
|
Топ | Оператор Top просматривает входные данные и возвращает только указанное число или процент строк, выбранных, возможно, на основе порядка сортировки. Столбец Argument может содержать список столбцов, которые проверяются на совпадения. Планируется использовать оператор Top для соблюдения ограничений на число строк.
Top — это логический и физический оператор.
Top — это логический и физический оператор. |
| Отсутствует | Сортировка по первым N |
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 — это логический оператор. |
|
Update |
Оператор Update обновляет каждую строку из входных данных объекта, указанного в Argument столбце плана выполнения запроса.
Update — логический оператор. Физический оператор — Table Update, Index Updateили Clustered Index Update. |
|
While |
Оператор While реализует Transact-SQL во время цикла.
While — это элемент языка |
|
Window Spool |
Оператор Window Spool расширяет каждую строку в набор строк, представляющих окно, связанное с ним. В запросе предложение OVER определяет окно в результирующем наборе запросов, а затем функция окна вычисляет значение для каждой строки в окне.
Window Spool — это логический и физический оператор. |
диспетчера
оператора
Значок
индекса
для