本文接上文: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. wget命令行本地克隆一个网站

    命令: wget -k -p -nH -N http://www.baidu.com -k 把已下载文件中的所有链接都转换为本地引用,不在依赖原始或在线内容 -p  下载所有必要文件,确保离线可用,包 ...

  2. [CEOI 2004]Sweet

    Description 题面链接 有 \(n\) 种糖果.第 \(i\) 种糖果有 \(m_i\) 个.取出一些糖果,至少 \(a\) 个,但不超过 \(b\) 个.求方案数. \(1\leq n\l ...

  3. [PA 2014]Bohater

    Description 在一款电脑游戏中,你需要打败n只怪物(从1到n编号).为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i]点生命值.任何时候你的生命值都不能降 ...

  4. POJ1743 Musical Theme(二分+后缀数组)

    题目大概是给n个数组成的串,求是否有多个“相似”且不重叠的子串的长度大于等于5,两个子串相似当且仅当长度相等且每一位的数字差都相等. 这题是传说中楼教主男人八题之一,虽然已经是用后缀数组解决不可重叠最 ...

  5. Hdu2680 最短路

    给定一个有向图,多个起点,一个终点,求起点到终点的最短路. 1.可以加一个点,使其与那些起点的距离为0 2.将图反着来建,然后在所有点找出最小的 方案一: #include <iostream& ...

  6. ●BZOJ 3996 [TJOI2015]线性代数

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3996 题解: 好题啊.(不太熟悉矩阵相关,所以按某些博主的模型转换来理解的)首先,那个式子可 ...

  7. Python中模块之hashlib&hmac的讲解

    hashlib & hmac的讲解 两个模块主要用于加密相关的操作. 1. hashlib模块 md5 具体代码如下 import hashlib ha_m5 = hashlib.md5()# ...

  8. .Net及C#基础知识,面试宝典

    作为你一.Net和C#开发这些知识,你是否掌握了,你是否算的上一名入门的程序员? 技术不行并不可怕,可怕的是你不知道自己还需做哪一方面的提升,本篇文字本人的一些面试时所经常涉及的问题,并且在网上收集了 ...

  9. 【集合框架】JDK1.8源码分析之HashMap(一) 转载

    [集合框架]JDK1.8源码分析之HashMap(一)   一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化 ...

  10. 关于一些基础的Java问题的解答(三)

    11. HashMap和ConcurrentHashMap的区别   从JDK1.2起,就有了HashMap,正如上一个问题所提到的,HashMap与HashTable不同,不是线程安全的,因此多线程 ...