运算符描述 SQL Server 如何执行查询或数据作语言 (DML) 语句。 查询优化器使用运算符生成查询计划来创建在查询中指定的结果,或执行 DML 语句中指定的作。 查询计划是一个由物理运算符组成的树。 可以使用 SET SHOWPLAN 语句、SQL Server Management Studio 中的图形执行计划选项或 SQL Server Profiler Showplan 事件类来查看查询计划。
运算符分类为逻辑运算符和物理运算符。
逻辑运算符
逻辑运算符描述用于处理语句的关系代数运算。 换句话说,逻辑运算符从概念上描述需要执行的操作。
物理运算符
物理运算符实现由逻辑运算符描述的操作。 每个物理运算符都是执行作的对象或例程。 例如,某些物理运算符从表、索引或视图访问列或行。 其他物理运算符执行其他作,例如计算、聚合、数据完整性检查或联接。 物理运算符具有与其相关的成本。
物理运算符初始化、收集数据和关闭。 具体而言,物理运算符可以应答以下三个方法调用:
Init(): Init() 方法导致物理运算符初始化自身并设置任何必需的数据结构。 物理运算符可能会收到许多 Init() 调用,但通常物理运算符只接收一个。
GetNext(): GetNext() 方法导致物理运算符获取第一行或后续数据行。 物理运算符可能会收到零个或多个 GetNext() 调用。
Close():Close() 方法使一个物理操作符执行清理操作并关闭自身。 物理运算符只接收一个 Close() 调用。
GetNext() 方法返回一行数据,调用它的次数在 Showplan 输出中显示为 ActualRows,该输出是使用 SET STATISTICS PROFILE ON 或 SET STATISTICS XML ON 生成的。 有关这些 SET 选项的详细信息,请参阅 SET STATISTICS PROFILE(Transact-SQL)和 SET STATISTICS XML(Transact-SQL)。
Showplan 输出中显示的 ActualRebinds 和 ActualRewinds 计数是指调用 Init() 方法的次数。 除非运算符位于循环连接的内部端,ActualRebinds 等于 1,而 ActualRewinds 等于 0。 如果运算符位于循环联接的内部端,则重新绑定和回退数的总和应等于联接外部处理的行数。 重新绑定表示联接的一个或多个相关参数已更改,并且必须重新计算内部端。 回退意味着不会更改任何相关参数,并且可以重复使用以前的内部结果集。
ActualRebinds 和 ActualRewinds 存在于使用 SET STATISTICS XML ON 生成的 XML Showplan 输出中。 它们仅针对非聚集索引 Spool、Remote Query
行计数 Spool、Sort
表 Spool和表值函数运算符进行填充。
ActualRebinds 和 ActualRewinds 也可以在 Assert
和 Filter 运算符中填充,当 StartupExpression 属性设置为 TRUE 时。
当 XML Showplan 中存在 ActualRebinds 和 ActualRewinds 时,它们与 EstimateRebinds 和 EstimateRewinds 相当。 不存在这些行时,估计的行数(EstimateRows)与实际行数(ActualRows)相当。 请注意,当实际重绑定和实际倒转不存在时,实际图形显示计划输出会显示零值。
仅当使用 SET STATISTICS XML ON 生成 Showplan 输出时,才提供相关的计数器 ActualEndOfScans。 每当物理运算符到达其数据流的末尾时,此计数器就会递增一个。 物理运算符可以零次、一次或多次到达其数据流的末尾。 与重新绑定和回退一样,仅当运算符位于循环联接的内部端时,扫描结束次数只能超过一个。 扫描结束次数应小于或等于重绑和倒退次数的总和。
映射物理和逻辑运算符
查询优化器将查询计划创建为包含逻辑运算符的树。 查询优化器创建计划后,查询优化器为每个逻辑运算符选择最有效的物理运算符。 查询优化器使用基于成本的方法来确定哪个物理运算符将实现逻辑运算符。
通常,逻辑作可由多个物理运算符实现。 但是,在极少数情况下,物理运算符也可以实现多个逻辑操作。
运算符说明
本部分包含逻辑运算符和物理运算符的说明。
图形执行计划图标 | Showplan 运算符 | DESCRIPTION |
---|---|---|
没有 | 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 同时向所有子节点发出 open() 调用,然后对每个子节点应用位图。 对于每个位是1时,Async Concat 按需将输出行发送到父节点。 |
![]() |
Bitmap |
SQL Server 使用 Bitmap 运算符在并行查询计划中实现位图筛选。 位图筛选通过在行通过另一个运算符(如 Parallelism 运算符)之前,消除键值无法生成任何联接记录的行,从而加快查询执行速度。 位图筛选器使用运算符树的一部分表中的一组值的紧凑表示形式来筛选树另一部分第二个表中的行。 通过在查询早期删除不必要的行,后续运算符使用的行更少,查询的整体性能会提高。 优化器确定位图过滤器在何时选择性足够以发挥作用,并确定在哪些运算符中应用此过滤器。
Bitmap 是物理运算符。 |
![]() |
Bitmap Create |
运算符 Bitmap Create 显示在生成位图的 Showplan 输出中。
Bitmap Create 是一个逻辑运算符。 |
![]() |
Bookmark Lookup |
运算符 Bookmark Lookup 使用书签(行 ID 或聚簇键)在表或聚簇索引中查找相应的行。 该 Argument 列包含用于在表或聚集索引中查找行的书签标识。 该 Argument 列还包含用于查找行的表或聚集索引的名称。 如果 WITH PREFETCH 子句出现在 Argument 列中,则查询处理器已确定在查找表或聚集索引中的书签时,最好使用异步预提取(预读)。Bookmark Lookup 不在 SQL Server 2014 中使用。 相反,Clustered Index Seek 和 RID Lookup 提供书签查找功能。 运算符 Key Lookup 还提供此功能。 |
没有 | Branch Repartition |
在并行查询计划中,有时有迭代器的概念区域。 此类区域中的所有迭代器都可以由并行线程执行。 区域整体必须串行执行。 在单个区域内的一些Parallelism 迭代器被称为Branch Repartition 。 称为Segment Repartition 的迭代器位于两个此类区域的Parallelism 边界。
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 从查询执行计划的 Argument 列中指定的聚集索引中删除行。 如果 Argument 列中存在 WHERE:() 谓词,则只会删除满足谓词的那些行。
Clustered Index Delete 是物理运算符。 |
![]() |
Clustered Index Insert |
Clustered Index Insert Showplan 运算符将输入中的行插入到 Argument 列中指定的聚集索引。 Argument 列还包含一个 SET:() 谓词,说明每个列被设置为的值。 如果 Clustered Index Insert 没有用于插入值的子节点,则插入的行取自 Insert 运算符本身。
Clustered Index Insert 是物理运算符。 |
![]() |
聚集索引合并 |
聚集索引合并运算符将合并数据流应用于聚集索引。 运算符从运算符中指定的 Argument 列的聚集索引中删除、更新或插入行。 执行的实际操作取决于在运算符的 Argument 列中指定的 ACTION 列的运行时值。
聚集索引合并 是一个物理运算符。 |
![]() |
Clustered Index Scan |
运算符 Clustered Index Scan 扫描查询执行计划的 Argument 列中指定的聚集索引。 当存在可选的 WHERE:() 谓词时,仅返回满足谓词的那些行。 如果 Argument 列包含 ORDERED 子句,则查询处理器已请求按聚集索引排序的顺序返回行的输出。 如果 ORDER 子句不存在,则存储引擎会以最佳方式扫描索引,而无需对输出进行排序。
Clustered Index Scan 是逻辑运算符和物理运算符。 |
![]() |
Clustered Index Seek |
运算符 Clustered Index Seek 使用索引的查找功能从聚集索引中检索行。 该 Argument 列包含正在使用的聚集索引的名称和 SEEK:() 谓词。 存储引擎使用索引仅处理符合 SEEK:() 谓词的那些行。 它还可以包含一个 WHERE:() 谓词,存储引擎会对满足 SEEK:() 谓词的所有行进行求值,但这只是可选的,并且不使用索引来完成此过程。如果 Argument 列包含 ORDERED 子句,则查询处理器已确定,必须按聚集索引排列行的顺序返回这些行。 如果 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 扫描指定的 Argument 列存储索引。 |
![]() |
Compute Scalar |
运算符 Compute Scalar 计算表达式以生成计算标量值。 然后,它可以被返回给用户、在查询的其他位置引用,或两者同时进行。 两者的示例都位于筛选器谓词或联接谓词中。
Compute Scalar 是逻辑运算符和物理运算符。Compute Scalar 在通过 SET STATISTICS XML 生成的 Showplans 中出现的运算符可能不包含 RunTimeInformation 元素。 在图形显示计划中,当在 SQL Server Management Studio 中选择包括实际执行计划选项时,属性窗口中可能会缺少实际行、实际重新绑定和实际倒带。 发生这种情况时,这意味着尽管这些运算符在编译的查询计划中使用了,但他们的工作是由运行时查询计划中的其他运算符执行的。 另请注意,SET STATISTICS PROFILE 生成的 Showplan 输出中的执行次数等效于 SET STATISTICS XML 生成的 Showplans 中的重绑定和倒退之和。 |
![]() |
串联 | 串联运算符扫描多个输入,并返回扫描的每一行。 串联 通常用于实现 Transact-SQL UNION ALL 构造。 串联物理运算符具有两个或多个输入和一个输出。 串联将行从第一个输入流复制到输出流,然后对每个附加输入流重复此作。 串联 是一个逻辑运算符和物理运算符。 |
![]() |
Constant Scan |
运算符 Constant Scan 将一个或多个常量行引入查询。
Compute Scalar 运算符通常在 Constant Scan 之后使用,以向 Constant Scan 运算符生成的行添加列。 |
![]() |
Convert |
运算符 Convert 将一个标量数据类型转换为另一种。
Convert 是语言元素。 |
没有 | Cross Join |
运算符 Cross Join 将第一个(top)输入中的每个行与第二个(底部)输入中的每一行相联接。
Cross Join 是一个逻辑运算符。 |
![]() |
catchall |
当生成图形显示计划的逻辑找不到适合迭代器的图标时,将会显示一个通用图标。 catchall 图标不一定指示错误条件。 有三个捕捉图标:蓝色(对于迭代器)、橙色(对于光标)和绿色(对于 Transact-SQL 语言元素)。 |
没有 | 光标 |
游标逻辑运算符和物理运算符用于描述如何执行涉及游标作的查询或更新。 物理运算符描述用于处理游标的物理实现算法;例如,使用键集驱动的游标。 执行游标的每个步骤都涉及物理运算符。 逻辑运算符描述游标的属性,例如游标是只读的。 逻辑运算符包括异步、乐观、主要、只读、滚动锁、辅助、同步。 物理运算符包括 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 逻辑运算符扫描输入,删除重复项,然后根据Argument 列的 DISTINCT ORDER BY:() 谓词中指定的列进行排序。
Distinct Sort 是一个逻辑运算符。 |
![]() |
分配数据流 |
Distribut Streams 运算符仅用于并行查询计划。
Distribut Streams 运算符采用单个记录输入流并生成多个输出流。 记录内容和格式不会更改。 输入流中的每个记录都出现在其中一个输出流中。 此运算符自动保留输出流中输入记录的相对顺序。 通常,哈希用于确定特定输入记录所属的输出流。 如果输出已分区,则 Argument 列包含 PARTITION COLUMNS:() 谓词和分区列。
分配流 是一个逻辑运算符 |
![]() |
Dynamic |
该 Dynamic 运算符使用游标来查看其他人所做的所有更改。 |
![]() |
急切的假脱机 |
Eager Spool 运算符采用整个输入,将每一行存储在数据库中的隐藏临时对象中tempdb 。 如果运算符被回绕(例如,由 Nested Loops 运算符),但不需要重新绑定,则使用卷绕的数据,而不是重新扫描输入。 如果需要重新绑定,则会丢弃假脱机数据,并通过重新扫描输入来重建假脱机对象。
Eager Spool 运算符以“急切”的方式生成其spool文件:当spool的父运算符要求第一行时,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 运算符使用多个输入流,并通过组合输入流生成单个记录输出流。 记录内容和格式不会更改。 如果此运算符是顺序保留,则必须对所有输入流进行排序。 如果输出是有序的,则 Argument 列包含 ORDER BY:() 谓词和要排序的列的名称。
Gather Streams 是一个逻辑运算符。 |
![]() |
Hash Match |
该 Hash Match 运算符通过计算其生成输入中每一行的哈希值来生成哈希表。 HASH:() 谓词,其中包含用于创建哈希值的列列表显示在 Argument 列中。 然后,对于每个探测行(如适用),它将计算哈希值(使用相同的哈希函数),并在哈希表中查找匹配项。 如果列中存在残差谓词(由 RESIDUAL:() Argument 标识),则还必须满足该谓词才能将行视为匹配项。 行为取决于正在执行的逻辑运算:对于任何连接,请使用第一个(顶部)输入生成哈希表,使用第二个(底部)输入来查询哈希表。 输出匹配项(或非匹配项),具体情况由连接类型决定。 如果多个联接使用相同的联接列,则这些操作将被分组到哈希组中。 对于非重复运算符或聚合运算符,请使用输入生成哈希表(删除重复项并计算任何聚合表达式)。 生成哈希表时,扫描表并输出所有条目。 对于联合运算符,请使用第一个输入生成哈希表(删除重复项)。 使用第二个输入(必须没有重复项)探测哈希表,返回所有没有匹配项的行,然后扫描哈希表并返回所有条目。 Hash Match 是物理运算符。 |
![]() |
If |
运算符 If 基于表达式执行条件处理。
If 是语言元素。 |
没有 | Inner Join |
Inner Join 逻辑运算符返回每一行,该行满足第一个(top)输入与第二个(bottom)输入的联接。 |
![]() |
Insert |
Insert 逻辑运算符将每一行从其输入插入列中指定的Argument 对象中。 物理运算符是Table Insert 或Index Insert Clustered Index Insert 运算符。 |
![]() |
插入扫描 | Inserted Scan 运算符扫描插入的表。 Inserted Scan 是一种逻辑运算符和物理运算符。 |
![]() |
Intrinsic |
运算符 Intrinsic 调用内部 Transact-SQL 函数。
Intrinsic 是语言元素。 |
![]() |
Iterator |
当生成图形显示计划的逻辑找不到适合迭代器的图标时,将会显示Iterator 通用图标。 catchall 图标不一定指示错误条件。 有三个捕捉图标:蓝色(对于迭代器)、橙色(对于光标)和绿色(对于 Transact-SQL 语言构造)。 |
![]() |
Key Lookup |
运算符 Key Lookup 是在具有聚集索引的表上进行书签查找。 该 Argument 列包含聚集索引的名称和用于查找聚集索引中的行的聚类分析键。
Key Lookup 始终由 Nested Loops 作员陪同。 如果 WITH PREFETCH 子句出现在 Argument 列中,则查询处理器已确定在查找聚集索引中的书签时,最好使用异步预提取(读取)。查询计划中运算符的使用 Key Lookup 表明查询可能受益于性能优化。 例如,可以通过添加覆盖索引来提高查询性能。 |
![]() |
Keyset |
运算符 Keyset 使用的游标能够查看更新,但无法查看其他人进行的插入。 |
![]() |
Language Element |
找不到适合迭代器的图标时,生成图形显示计划的逻辑会显示Language Element 通用图标。 通用图标不一定表示错误条件。 有三个捕捉图标:蓝色(对于迭代器)、橙色(对于光标)和绿色(对于 Transact-SQL 语言构造)。 |
![]() |
懒序列 |
Lazy Spool 逻辑运算符将每一行从其输入中存储到数据库中的tempdb 隐藏临时对象。 如果运算符被回卷(例如,通过 Nested Loops 运算符),但不需要重新绑定,则使用缓存的数据,而不是重新扫描输入。 如果需要重新绑定,则会丢弃缓存数据,并通过重新扫描绑定输入来重建缓存对象。
Lazy Spool 运算符以“懒惰”的方式构建其缓冲文件,即每次缓冲运算符的父运算符请求行时,缓冲运算符从其输入运算符获取一行并将其存储在缓冲区中,而不是一次性使用所有行。 惰性数据缓冲区是一个逻辑运算符。 |
没有 | Left Anti Semi Join |
当第二个(底部)输入中没有匹配行时,运算符 Left Anti Semi Join 返回第一个(top)输入中的每一行。 如果列中不存在 Argument 联接谓词,则每一行都是匹配的行。
Left Anti Semi Join 是一个逻辑运算符。 |
没有 | Left Outer Join |
运算符 Left Outer Join 返回满足第一个(top)输入与第二个(bottom)输入的联接的每个行。 它还返回第一个输入中没有任何匹配行的第二个输入中的任何行。 第二个输入中的非匹配行将作为 null 值返回。 如果列中不存在 Argument 联接谓词,则每一行都是匹配的行。
Left Outer Join 是一个逻辑运算符。 |
没有 | Left Semi Join |
当第二个(底部)输入中有匹配行时,该 Left Semi Join 运算符返回第一个(top)输入中的每一行。 如果列中不存在 Argument 联接谓词,则每一行都是匹配的行。
Left Semi Join 是一个逻辑运算符。 |
![]() |
Log Row Scan |
Log Row Scan 操作员扫描事务日志。
Log Row Scan 是逻辑运算符和物理运算符。 |
![]() |
Merge Interval |
Merge Interval 运算符合并多个(可能重叠的)间隔,以生成最小且不重叠的间隔,并用来进行索引查找。 此运算符通常出现于一个或多个 Compute Scalar 运算符之上,并且 Compute Scalar 运算符在 Constant Scan 运算符之上,这些 Constant Scan 运算符构造出该运算符合并的间隔(在行中表示为列)。
Merge Interval 是逻辑运算符和物理运算符。 |
![]() |
合并联接 |
Merge Join 运算符执行内部联接、左外部联接、左半联接、左反半联接、右外部联接、右半联接、右反半联接和联合逻辑操作。Argument 列中,如果操作执行的是一对多联接,则合并联接运算符包含 MERGE:() 谓词;如果操作执行的是多对多联接,则包含 MANY-TO-MANY MERGE:() 谓词。 该 Argument 列还包括用于执行操作的列的逗号分隔列表。
Merge Join 运算符要求两个输入在各自的列上进行排序,这可能通过将显式排序操作插入到查询计划中来实现。 如果不需要显式排序,则合并联接特别有效,例如,如果数据库中有合适的 B 树索引,或者可以利用排序顺序进行多个操作(如合并联接和汇总分组)。
合并联接 是一个物理运算符。 |
![]() |
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 子句,则查询处理器已确定必须按照非聚集索引对行进行排序的顺序返回这些行。 如果 ORDER 子句不存在,则存储引擎会以最佳方式搜索索引(这不能保证输出将排序)。 允许输出保留其排序可能比生成非排序输出效率低。
Index Seek 是逻辑运算符和物理运算符。 |
![]() |
索引分流 |
Index Spool 物理运算符在Argument 列中包含 SEEK:() 谓词。
Index Spool 运算符会扫描其输入行,将每一行的副本放置在隐藏的假脱机文件中(存储在tempdb 数据库中且仅在查询生存期内存在),并在行上构建非聚集索引。 这使得您可以使用索引的查找功能,仅输出那些满足SEEK:()谓词的行。 如果运算符被回绕(例如,由 Nested Loops 运算符)但不需要重新绑定,则使用缓存数据,而不是重新扫描输入。 |
![]() |
Nonclustered Index Update |
Nonclustered Index Update 物理运算符通过Argument 指定的列中的非聚集索引更新其输入中的行。 如果存在 SET:() 谓词,则每个更新的列都被设置为该值。
Nonclustered Index Update 是物理运算符。 |
![]() |
联机索引插入 | Online Index Insert 物理运算符指示联机执行索引创建、更改或删除作。 也就是说,基础表数据在索引作期间仍可供用户使用。 |
没有 | Parallelism |
运算符 Parallelism 执行分布流、收集流和重新分区流的逻辑操作。 这些 Argument 列可以包含 PARTITION COLUMNS:() 谓词,包括要分区的列的逗号分隔列表。 这些 Argument 列还可以包含 ORDER BY:() 谓词,其中列出了要在分区期间保留排序顺序的列。
Parallelism 是物理运算符。注意:如果查询已编译为并行查询,但在运行时它作为串行查询运行,则 SET STATISTICS XML 生成的 Showplan 输出或使用 SQL Server Management Studio 中的 “包括实际执行计划 ”选项将不包含 RunTimeInformation 运算符的 Parallelism 元素。 在 SET STATISTICS PROFILE 输出中,运算符 Parallelism 的实际行计数和实际执行次数将显示为零。 当任一条件发生时,这意味着 Parallelism 运算符仅在查询编译期间使用,而不是在运行时查询计划中使用。 请注意,如果服务器上存在高并发负载,则有时并行查询计划会串行运行。 |
![]() |
Parameter Table Scan |
运算符 Parameter Table Scan 扫描一个表,该表在当前查询中充当参数。 这通常用于存储过程中的 INSERT 查询。
Parameter Table Scan 是逻辑运算符和物理运算符。 |
没有 | 部分聚合 |
部分聚合 用于并行计划。 它向尽可能多的输入行应用聚合函数,以避免写入磁盘(称为“转储”)。
Hash Match 是实现分区聚合的唯一物理运算符(迭代器)。
分部聚合 是一个逻辑运算符。 |
![]() |
Population Query |
运算符 Population Query 在打开游标时填充游标的工作表。 |
![]() |
Refresh Query |
运算符 Refresh Query 从提取缓冲区获取当前行数据。 |
![]() |
Remote Delete |
运算符 Remote Delete 从远程对象中删除输入行。
Remote Delete 是逻辑运算符和物理运算符。 |
![]() |
远程索引扫描 | 远程索引扫描运算符扫描参数列中指定的远程索引。 远程索引扫描 是一个逻辑运算符和物理运算符。 |
![]() |
远程索引查找 |
Remote Index Seek 运算符使用远程索引对象的查找功能来检索行。 该 Argument 列包含正在使用的远程索引的名称和 SEEK:() 谓词。
Remote Index Seek 是一个逻辑物理运算符。 |
![]() |
远程插入 | 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:() 谓词和正在排序的列。
重分数据流 是一个逻辑运算符。 运算符仅用于并行查询计划。 |
![]() |
Result |
运算符 Result 是在查询计划结束时返回的数据。 这通常是 Showplan 的根元素。
Result 是语言元素。 |
![]() |
RID Lookup |
RID Lookup 是在堆上使用提供的行标识符(RID)进行书签查找。 该 Argument 列包含用于在表中查找行的书签标签以及该行所在表的名称。
RID Lookup 始终附带 NESTED LOOP JOIN。
RID Lookup 是物理运算符。 有关书签查找的详细信息,请参阅 MSDN SQL Server 博客上的“书签查找”。 |
没有 | Right Anti Semi Join |
当 Right Anti Semi Join 第一个(top)输入中的匹配行不存在时,运算符从第二个(bottom)输入输出每一行。 匹配行定义为满足列中谓词 Argument 的行(如果没有谓词,则每行都是匹配行)。
Right Anti Semi Join 是一个逻辑运算符。 |
没有 | Right Outer Join |
该 Right Outer Join 运算符返回满足第二个(底部)输入与第一个(顶部)输入中每个匹配行联接的每一行。 它还返回第二个输入中没有与第一个输入中的行匹配的任何行,且这些行的联接值为 NULL。 如果列中不存在 Argument 联接谓词,则每一行都是匹配的行。
Right Outer Join 是一个逻辑运算符。 |
没有 | Right Semi Join |
当第一个(top)输入中有匹配行时,运算符 Right Semi Join 返回第二个(bottom)输入中的每一行。 如果列中不存在 Argument 联接谓词,则每一行都是匹配的行。
Right Semi Join 是一个逻辑运算符。 |
![]() |
行计数缓存 |
行计数 Spool 运算符扫描输入,对存在的行数进行计数,并返回相同数量的行,而无需其中任何数据。 当检查是否存在行而不是行中包含的数据时,将使用此运算符。 例如,如果 Nested Loops 运算符执行左半联接操作,并且联接谓词适用于内部输入,则行计数缓冲区可能会放置在 Nested Loops 运算符的内部输入的顶部。 然后,Nested Loops 运算符可以通过确定行计数缓存输出的行数(因为不需要内侧的实际数据)来决定是否返回外部行。
行计数缓存 是一个物理运算符。 |
![]() |
段 | 分段 是一个同时执行物理和逻辑运算的操作符。 它根据一个或多个列的值将输入集划分为段。 这些列在 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 对所有传入行进行排序。
Argument 列中包含 DISTINCT ORDER BY:() 谓词(如果通过该操作删除重复项),或者包含带有要排序之列的逗号分隔列表的 ORDER BY:() 谓词。 如果列按升序排序,则列的前缀为 ASC 值;如果列按降序排序,则为 DESC 值。
Sort 是逻辑运算符和物理运算符。 |
![]() |
Split |
该 Split 运算符用于优化更新处理。 它将每个更新操作分割为删除操作和插入操作。
Split 是逻辑运算符和物理运算符。 |
![]() |
卷轴 |
Spool 运算符将中间查询结果保存到tempdb 数据库。 |
![]() |
Stream Aggregate |
Stream Aggregate 运算符按一个或多个列对行进行分组,然后计算查询返回的一个或多个聚合表达式。 此运算符的输出可被查询中的后续运算符引用、返回给客户端,或同时满足这两种情况。 运算符 Stream Aggregate 需要按其组中的列排序的输入。 如果数据不是由于先前的Sort 运算符或已排序的索引查找或扫描而已经排序,优化器将在该运算符之前使用Sort 运算符。 在 SQL Server Management Studio 中的 SHOWPLAN_ALL 语句或图形执行计划中,GROUP BY 谓词中的列列在 Argument 列中,聚合表达式列在 “定义值” 列中。
Stream Aggregate 是物理运算符。 |
![]() |
开关 | Switch 是具有 n 个输入的特殊串联迭代器类型。 表达式与每个 Switch 运算符相关联。 根据表达式的返回值(介于 0 和 n-1 之间), Switch 会将相应的输入流复制到输出流。 Switch 的一种用途是实现包含某些运算符(如 TOP 运算符)的快速向前游标的查询计划。 Switch 既是逻辑运算符,也是物理运算符。 |
![]() |
Table Delete |
Table Delete 物理运算符从查询执行计划的列中指定的Argument 表中删除行。 |
![]() |
Table Insert |
运算符 Table Insert 将其输入的行插入到查询执行计划中Argument 列指定的表中。 该 Argument 列还包含一个 SET:() 谓词,用于指示各个列的设定值。 如果 Table Insert 插入值没有子级,则插入的行取自 Insert 运算符本身。
Table Insert 是物理运算符。 |
![]() |
表合并 |
表合并运算符将合并数据流应用于堆。 运算符删除、更新或插入表中由运算符指定的 Argument 列中的行。 执行的实际作业取决于运算符的Argument ACTION列中指定的运行时值。
表合并 是一个物理运算符。 |
![]() |
Table Scan |
运算符 Table Scan 从查询执行计划的列中指定的 Argument 表中检索所有行。 如果 WHERE:() 谓词出现在 Argument 列中,则只返回那些满足谓词的行。
Table Scan 是逻辑运算符和物理运算符。 |
![]() |
表缓存 |
Table Spool 运算符扫描输入,并将每一行的副本放入存储在 tempdb 数据库中的隐藏缓存表中,该表仅在查询的生命周期内存在。 如果运算符被回卷(例如,由 Nested Loops 运算符),但不需要重新绑定,则使用缓存的数据,而不是重新扫描输入。
表线轴 是一个物理运算符。 |
![]() |
Table Update |
Table Update 物理运算符更新查询执行计划中Argument 列指定的表中的输入行。 SET:() 谓词确定每个更新列的值。 这些值可以在 SET 子句中引用,也可以引用此运算符中的其他位置以及此查询中的其他位置。 |
![]() |
表值函数 |
表值函数运算符计算表值函数(Transact-SQL 或 CLR),并将生成的行存储在 tempdb 数据库中。 当父迭代器请求行时, 表值函数 从中 tempdb 返回行。调用表值函数的查询使用 表值函数 迭代器生成查询计划。 可以使用不同的参数值计算表值函数: 表值函数 XML 读取器 将 XML BLOB 作为参数输入,并生成一个行集,表示 XML 文档顺序中的 XML 节点。 其他输入参数可能会限制返回到 XML 文档子集的 XML 节点。 具有 XPath 筛选器的表值函数 XML 读取器 是一种特殊类型的 XML 读取器表值函数 ,用于将输出限制为满足 XPath 表达式的 XML 节点。 表值函数 是一个逻辑运算符和物理运算符。 |
![]() |
顶部 |
Top 运算符扫描输入,仅返回第一个指定的行数或百分比,可能基于排序顺序。 该 Argument 列可以包含正在检查是否有关系的列的列表。 在更新计划中, Top 运算符用于强制实施行计数限制。
Top 是一个逻辑和物理运算符。
Top 是一个逻辑和物理运算符。 |
没有 | 排名靠前 N 的排序 |
前 N 个排序 类似于 Sort 迭代器,只需要前 N 行,而不是整个结果集。 对于 N 的较小值,SQL Server 查询执行引擎会尝试在内存中执行整个排序作。 对于 较大值的 N,查询执行引擎会采用更通用的方法进行排序,此时 N 并不是一个参数。 |
![]() |
UDX |
扩展运算符(UDX)通过在 SQL Server 中实现多种 XQuery 和 XPath 操作。 所有 UDX 运算符都是逻辑运算符和物理运算符。 扩展运算符(UDX) FOR XML 用于将其输入的关系行集合序列化为 XML 格式,并在单个输出行中存储在单个 BLOB 列中。 它是区分顺序的 XML 聚合运算符。扩展运算符 (UDX) XML SERIALIZER 是区分顺序的 XML 聚合运算符。 它以 XML 文档顺序输入表示 XML 节点或 XQuery 标量的行,并在单个输出行的单个 XML 列中生成序列化的 XML BLOB。扩展运算符(UDX) XML FRAGMENT SERIALIZER 是一种特殊类型 XML SERIALIZER ,用于处理表示在 XQuery 插入数据修改扩展插件中插入的 XML 片段的输入行。扩展运算符 (UDX) XQUERY STRING 计算表示 XML 节点的输入行的 XQuery 字符串值。 它是区分顺序的字符串聚合运算符。 它输出一行,其中列表示包含输入字符串值的 XQuery 标量。扩展运算符 (UDX) XQUERY LIST DECOMPOSER 是 XQuery 列表分解运算符。 对于表示 XML 节点的每个输入行,它生成一行或多行,每个行表示 XQuery 标量,如果输入为 XSD 列表类型,则包含列表元素值。扩展运算符 (UDX) XQUERY DATA 在表示 XML 节点的输入上计算 XQuery fn:data() 函数。 它是区分顺序的字符串聚合运算符。 它输出一行,其中列表示 XQuery 标量,其中包含 fn:data()的结果。扩展运算符 XQUERY CONTAINS 在表示 XML 节点的输入上评估 XQuery fn:contains() 函数。 它是区分顺序的字符串聚合运算符。 它输出一行,其中列表示 XQuery 标量,其中包含 fn:contains() 的结果。扩展运算符 UPDATE XML NODE 更新 XQuery 中的 XML 节点,替换 XML 类型的 modify() 方法中的数据修改扩展插件。 |
没有 | 联盟 | Union 运算符扫描多个输入,输出扫描的每一行并删除重复项。 联合 是一个逻辑运算符。 |
![]() |
Update |
运算符 Update 更新其输入中的每一行,更新内容存储在查询执行计划的 Argument 列中指定的对象中。
Update 是一个逻辑运算符。 物理运算符为 Table Update , Index Update 或 Clustered Index Update 。 |
![]() |
While |
运算符 While 实现 Transact-SQL while 循环。
While 是语言元素 |
![]() |
Window Spool |
运算符 Window Spool 将每一行扩展到表示与其关联的窗口的行集中。 在查询中,OVER 子句定义查询结果集中的窗口,然后一个窗口函数计算窗口中每一行的值。
Window Spool 是逻辑运算符和物理运算符。 |