本文接上文: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. SQL Server 执行计划操作符详解(3)——计算标量(Compute Scalar)

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

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

    本文接上文:SQL Server 执行计划操作符详解(1)--断言(Assert) 前言: 根据计划,本文开始讲述另外一个操作符串联(Concatenation),读者可以根据这个词(中英文均可)先幻 ...

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

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

  6. SQL Server 执行计划缓存

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

  7. 微软官方提供的用于监控MS SQL Server运行状况的工具及SQL语句

    Microsoft SQL Server 2005 提供了一些工具来监控数据库.方法之一是动态管理视图.动态管理视图 (DMV) 和动态管理函数 (DMF) 返回的服务器状态信息可用于监控服务器实例的 ...

  8. Chapter 1 Securing Your Server and Network(1):选择SQL Server运行账号

    原文:Chapter 1 Securing Your Server and Network(1):选择SQL Server运行账号 原文出处:http://blog.csdn.net/dba_huan ...

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

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

随机推荐

  1. Redis的事务讲解

    1. Redis事务的概念 是什么: 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序串行化的执行而不会被其他命令插入 能干嘛:一个队列中,一次性.顺序性.排他性的执 ...

  2. linux shell 编程笔记

    重定向和管道  输出重定向:把在终端输出的内容保存到文件上  输入重定向:通过文件的格式输入内容到终端  管道:把上一条命令的输出作为下一条命令的输入,如同管道一样,所有命令同时进行,同时处理数据,不 ...

  3. golang 字符串替换截取

    package main import "fmt" func main() { str := "XBodyContentX" content := str[1 ...

  4. BZOJ 1303

    思路: 水题  竟然不会做 尴尬 比b大的数=1 比b小的数=-1 找到b 统计一下左边比b大x的数有多少 扫右边的时候就查左边的表 就可以了 //By SiriusRen #include < ...

  5. 设计模式之桥接模式(Java语言描述)

    桥接模式定义 將抽象部分与它的具体实现部分分离,使它们都可以独立地变化.它是一种对象结构型模式,又称为柄体模式或接口模式. Decouple an abstraction from its imple ...

  6. Vs2010删除空白行

    在copy了别人的代码之后,出现了大量的空白行,批量删除空白行方法为: 查找内容:^:b*$\n 替换为: 查找范围:当前文档 使用:正则表达式

  7. dataGridView 设置

    //窗体加载事件 //内容居中 dataGridView1.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCe ...

  8. 卸载pycharm再重新安装后,找不到第三方库

    遇到的问题: 看到pycharm出了新的版本,手痒把旧的版本卸载,然后安装了最新的版本,然后问题就来了. 之前通过PIP命令安装的第三方库,import的时候都报错,找不到模块.既然以前能正常使用,现 ...

  9. EMC VNX5200/5400存储 新增LUN与Hosts映射操作

    EMC VNX5200/5400 1.创建RAID  Groups 1.1        进入EMC VNX5200/5400主界面,依次选择Storage——Storage Pools——RAID ...

  10. Java8新特性-接口中的静态方法与默认方法

    今天上午在读<Effective Java>时,有这样一句话:”接口中“不能有静态方法,于是联想起面试时老是被问接口相关的东西,决定总结一下,谁知道这一总结,就发现了自己知识的一大漏洞.  ...