逻辑运算符和物理运算符引用

运算符说明了 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 显示在使用 SET STATISTICS PROFILE ON 或 SET STATISTICS XML ON 生成的显示计划输出中。有关这些 SET 选项的详细信息,请参阅 SET STATISTICS PROFILE (Transact-SQL)SET STATISTICS XML (Transact-SQL)

显示计划输出中显示的 ActualRebindsActualRewinds 计数是指 Init() 方法被调用的次数。除非运算符位于循环联接的内侧,否则 ActualRebinds 等于一,ActualRewinds 等于零。如果运算符位于循环联接的内侧,那么重新绑定次数和重绕次数之和应等于联接外侧所处理的行数。重新绑定意味着联接的一个或多个相关参数发生更改后,必须重新计算联接的内侧。重绕意味着任何相关参数都没有发生更改,可以重用之前的内侧结果集。

ActualRebindsActualRewinds 显示在使用 SET STATISTICS XML ON 生成的 XML 显示计划输出中。它们只为 Nonclustered Index SpoolRemote QueryRow Count SpoolSortTable SpoolTable-valued Function 运算符填充。如果 StartupExpression 属性设置为 TRUE,也会为 AssertFilter 运算符填充 ActualRebindsActualRewinds

ActualRebindsActualRewinds 显示在 XML 显示计划中时,它们可以与 EstimateRebindsEstimateRewinds 相比较。如果它们没有显示,则预计的行数 (EstimateRows) 可以与实际的行数 (ActualRows) 相比较。注意,如果它们没有显示,实际的图形显示计划输出中将实际的重新绑定次数和重绕次数均显示为零。有关图形显示计划的详细信息,请参阅显示图形执行计划 (SQL Server Management Studio)

只有在显示计划输出是使用 SET STATISTICS XML ON 生成的情况下,相关计数器 ActualEndOfScans 才可用。只要物理运算符到达其数据流的结尾,此计数器就增加一。物理运算符可以到达其数据流结尾零次、一次或多次。对于重新绑定次数和重绕次数,只有在运算符位于循环联接的内侧时,扫描结束的次数才可以多于一次。扫描结束的次数应少于或等于重新绑定次数与重绕次数之和。

物理运算符与执行算法对应。物理运算符的示例包括 index scan/seek、nested loop join、merge join、hash join/aggregation 和 stream aggregation。物理运算符具有与其关联的开销。查询执行或 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

游标逻辑运算符和物理运算符

Log Row Scan