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

Операторы описывают, как SQL Server выполняет запрос или инструкцию языка DML. Оптимизатор запросов использует операторы для построения плана запроса, чтобы создать результат, заданный в запросе, или произвести операцию, указанную в DML-инструкции. План запроса — это дерево физических операторов.

Операторы классифицируются как логические и физические. Логические операторы описывают реляционные операции обработки запросов на концептуальном уровне. Физические операторы фактически реализуют операцию, определенную логическим оператором, используя конкретный метод или алгоритм. Например, «join» — это оператор логический, а «nested loops joins» — физический.

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

  • Физические операторы
    Физические операторы реализуют действия, описанные логическими операторами. Каждый физический оператор является объектом или процедурой, выполняющей операцию. Например, некоторые физические операторы обращаются к столбцам и строкам таблицы, индекса или представления. Другие физические операторы выполняют другие типы операций: Оператор Aggregate вычисляет выражения с функциями MIN, MAX, SUM, COUNT или AVG, а оператор Merge Join выполняет различные типы логических операций соединения.

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

    • 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 отображает нули для действительных повторных привязок и сбросов на начало, когда те отсутствуют. Дополнительные сведения о выводе инструкций Showplan в графическом формате см. в разделе Графическое отображение планов выполнения (SQL Server Management Studio).

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

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

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

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

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

В этом разделе

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

Aggregate

Merge Interval

Arithmetic Expression

Merge Join

Assert

Nested Loops

Assign

Nonclustered Index Delete

Async Concat

Nonclustered Index Insert

Bitmap

Nonclustered Index Scan

Bitmap Create

Nonclustered Index Seek

Bookmark Lookup

Nonclustered Index Spool

Branch Repartition

Nonclustered Index Update

Broadcast

Online Index Insert

Cache

Parallelism

Clustered Index Delete

Parameter Table Scan

Clustered Index Insert

Partial Aggregate

Clustered Index Merge

Population Query

Clustered Index Scan

Refresh Query

Clustered Index Seek

Remote Delete

Clustered Index Update

Remote Index Scan

Collapse

Remote Index Seek

Compute Scalar

Remote Insert

Concatenation

Remote Query

Constant Scan

Remote Scan

Convert

Remote Update

Cross Join

Repartition Streams

Cursor Catchall

Result

Declare

RID Lookup

Delete

Right Anti Semi Join

Deleted Scan

Right Outer Join

Distinct

Right Semi Join

Distinct Sort

Row Count Spool

Distribute Streams

Segment

Dynamic

Segment Repartition

Eager Spool

Sequence

Fetch Query

SequenceProject

Filter

Snapshot

Flow Distinct

Sort

Full Outer Join

Split

Gather Streams

Spool

Hash Match

Stream Aggregate

Hash Match Root

Switch

Hash Match Team

Table Delete

If

Table Insert

Inner Join

Table Merge

Insert

Table Scan

Inserted Scan

Table Spool

Intrinsic

Table Update

Iterator Catchall

Table-Valued Function

Key Lookup

Top

Keyset

Top N Sort

Language Element Catchall

UDX

Lazy Spool

Union

Left Anti Semi Join

Update

Left Outer Join

While

Left Semi Join

Логический и физический операторы Cursor

Log Row Scan