本文接上文:SQL Server 执行计划操作符详解(1)——断言(Assert)

前言:


根据计划,本文开始讲述另外一个操作符串联(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,在后续再介绍。
下一篇将介绍:计算标量:Compute Scalar  

SQL Server 执行计划操作符详解(2)——串联(Concatenation )的更多相关文章

  1. SQL Server 执行计划操作符详解(3)——计算标量(Compute Scalar)

    接上文:SQL Server 执行计划操作符详解(2)--串联(Concatenation ) 前言: 前面两篇文章介绍了关于串联(Concatenation)和断言(Assert)操作符,本文介绍第 ...

  2. SQL Server 执行计划操作符详解(1)——断言(Assert)

    前言: 很多很多地方对于语句的优化,一般比较靠谱的回复即使--把执行计划发出来看看.当然那些只看语句就说如何如何改代码,我一直都是拒绝的,因为这种算是纯蒙.根据本人经验,大量的性能问题单纯从语句来看很 ...

  3. MySQL 执行计划explain详解

    MySQL 执行计划explain详解 2015-08-10 13:56:27 分类: MySQL explain命令是查看查询优化器如何决定执行查询的主要方法.这个功能有局限性,并不总会说出真相,但 ...

  4. SQL Server 执行计划缓存

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述 了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储,这也是写这篇文章的目的,在了解执行计划之 ...

  5. sql server 执行计划(execution plan)介绍

    大纲:目的介绍sql server 中执行计划的大致使用,当遇到查询性能瓶颈时,可以发挥用处,而且带有比较详细的学习文档和计划,阅读者可以按照我计划进行,从而达到对执行计划一个比较系统的学习. 什么是 ...

  6. SQL Server 执行计划中的扫描方式举例说明

    SQL Server 执行计划中的扫描方式举例说明 原文地址:http://www.cnblogs.com/zihunqingxin/p/3201155.html 1.执行计划使用方式 选中需要执行的 ...

  7. SQL Server执行计划那些事儿(3)——书签查找

    接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混).当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下. ...

  8. SQL Server执行计划那些事儿(2)——查找和扫描

    接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混).当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下. ...

  9. 引用:初探Sql Server 执行计划及Sql查询优化

    原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之————探索MSSQL执行计划 作者:no_mIss 最近总想 ...

随机推荐

  1. SRM 558 SurroundingGame

    题意: 给定一个网格,每个网格有选取代价和占据收益.每个点被占据,需要满足以下两个条件至少一个条件:1.被选取  2.邻近方格都被选取(有公共边被称为邻近)  不一定要占据所有方格,求最大收益. 输入 ...

  2. hdu 5122(2014北京—dp)

    题意: 从n个数中任选一些数,问有多少种选法使他们异或和不小于M 思路: dp[i][j]表示选i个数异或和为j,则方程dp[i][j] = dp[i-1][j](不选i)+ dp[i-1][j^a[ ...

  3. C++函数式编程实现牛顿法

    In numerical analysis, Newton's method (also known as the Newton–Raphson method), named after Isaac ...

  4. 使用PowerPoint

    制作PPT在我们的学习生活中非常常见,PPT也就是演示文稿,平时我们在别人演示和讲解一些内容时都需要用到PPT.PPT可以在电脑上进行放映,看上去就好像一张一张的图片,但与图片不同的是它可以进行编辑. ...

  5. Delphi7数据库编程之TDataSet(转)

    TDataSet类由TBDEDataSet(BDE组件).TCustomADODataSet(ADO组件).TIBCustomDataSet(InterBase组件).TCustomSQLDataSe ...

  6. 实现string类

    /* 实现string类 */ class String {    public:           String(const char *str=NULL); //构造函数           S ...

  7. linux安装ftp

    安装vsftpd 1.以管理员(root)身份执行以下命令 1.  yum install vsftpd 2.设置开机启动vsftpd ftp服务 1.  chkconfig vsftpd on 3. ...

  8. python map filter reduce的优化使用

    这篇讲下python中map.filter.reduce三个内置函数的使用方式,以及优化方法. map()函数 map()函数会根据提供的函数对指定序列做映射. 语法: map(function,it ...

  9. node之fs模块

    前言 fs是filesystem的缩写,该模块提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包装.但是,这个模块几乎对所有操作提供异步和同步两种操作方式,供开发者选择. 一.文件读取 文 ...

  10. [原创]基于VueJs的前后端分离框架搭建之完全攻略

    首先请原谅本文标题取的有点大,但并非为了哗众取宠.本文取这个标题主要有3个原因,这也是写作本文的初衷: (1)目前国内几乎搜索不到全面讲解如何搭建前后端分离框架的文章,讲前后端分离框架思想的就更少了, ...