SQL Server 执行计划操作符详解——串联(Concatenation )

Posted binghou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server 执行计划操作符详解——串联(Concatenation )相关的知识,希望对你有一定的参考价值。

前言:

       根据计划,本文开始讲述另外一个操作符串联(Concatenation),读者可以根据这个词(中英文均可)先幻想一下是干嘛的。其实还是挺直观,就是把东西连起来,那么下面我们来看看到底连什么?怎么连?什么时候连?

简介:

       串联操作符既是物理操作符,也是逻辑操作符,在中文版SQL Server的图形化执行计划中称为“串联”,在其他格式及英文版本中称为“Concatenation”。其图标为: 技术分享图片

,它扫描多个输入并返回每个扫描的行。通常用于实现T-SQL中的UNION ALL。它可以有多个输入,但只有一个输出,就如多个集合UNION ALL一样,最终返回一个结果集,注意这里一直使用“集合/集”,关系数据库是基于集合论的,所以使用关系数据库时要以集合的思维去考虑问题。

       在执行计划中的每个操作符,都要实现三个方法/函数:Init()、GetNext()和Close()。前面说了,串联操作符是其中一种可以接受多个输入的操作符,这些输入会在Init()方法中处理。

       在Init()方法中,串联初始化然后建立所需的数据结构。然后在运行GetNext()方法读取输入集中的第一行及后续行,直到把输入集合里面的所有数据读取完毕为止。

环境搭建:

 

       下面创建一个测试表并循环插入10000行数据。

USE tempdb 

GO 

IF OBJECT_ID(‘TEST‘, ‘U‘) IS NOT NULL 

    DROP TABLE TEST 

GO 

CREATE TABLE Test ( 

    ID INT Identity(1, 1) PRIMARY KEY 

    ,Nome VARCHAR(250) DEFAULT NewID() 

    ) 

GO 

SET NOCOUNT ON 

GO 

INSERT INTO Test DEFAULT 

VALUES  

GO 10000 

串联演示:

 

       前面提到,串联主要用于实现T-SQL的UNION ALL ,那么现在就来看看UNION ALL的情况:

       开启实际执行计划并运行下面语句:

SELECT * FROM TEST 

UNION ALL 

SELECT * FROM TEST 

UNION ALL 

SELECT * FROM TEST 

UNION ALL 

SELECT * FROM TEST 

执行计划如下:

 技术分享图片

如果使用SET SHOWPLAN_TEXT ON来查看的话可以看到如下结果:

 技术分享图片 

       这个图的含义是把4个“Clustered Index Scan”的结果塞到一个结果集,然后调用Init()和GetNext()方法去遍历这些数据,然后输出。另外需要说明的是这个操作符是根据T-SQL中结果集的出现顺序来处理的,为了证明这个想法,我们来改写一下语句:

SET SHOWPLAN_TEXT ON  

GO 

SELECT * FROM TEST 

WHERE ID<100 

UNION ALL 

SELECT * FROM TEST 

WHERE ID BETWEEN 101 AND 1000 

UNION ALL 

SELECT * FROM TEST 

WHERE ID BETWEEN 1001 AND 5000 

UNION ALL 

SELECT * FROM TEST 

WHERE ID >5001 

       然后看看输出:

 技术分享图片

       对比一下参数可得每个Clustered Index Seek的顺序和语句的出现顺序是一致的。另外读者可能留意到每行最后的ORDERED FORWARD,其含义是扫描索引的顺序是按照聚集索引的顺序并向前扫描。
       关于这个话题可以看看SQL Server技术内幕主要作者Kalen Delaney的博客:Ordered Seeks and Scans

总结:

       本文主要演示了串联操作符的情况,并且主要以T-SQL中的UNION ALL来触发。由于目前没有任何资料显示是否仅UNION ALL才会使用,所以这里也不做绝对的判断,读者只需要知道这个操作符的含义、常见情景即可。另外读者可以使用UNION 来检查执行计划,实际上UNION 是不用串联的,因为它本质上需要去重,所以使用不同的操作符来实现,比如Merge Join,在后续再介绍。


以上是关于SQL Server 执行计划操作符详解——串联(Concatenation )的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 堆heap 非聚集索引 Nonclustered index 行号键查找RID loopup结合执行计划过程详解

SQL Server 聚集索引 clustered index 非聚集索引Nonclustered Indexes键查找查找Key Lookup执行计划过程详解

Sql Server中执行计划的缓存机制

sql server 根据执行计划查询耗时操作

MySQL 优化sql explain执行计划详解

sql server 如何执行一项计划任务