zoukankan      html  css  js  c++  java
  • SQL Server 运行计划操作符具体解释(2)——串联(Concatenation )


    本文接上文:SQL Server 运行计划操作符具体解释(1)——断言(Assert)


    前言:


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

    简单介绍:


    串联操作符既是物理操作符,也是逻辑操作符。在中文版SQL Server的图形化运行计划中称为“串联”,在其它格式及英文版本号中称为“Concatenation”。

    其图标为: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  
  • 相关阅读:
    2018-8-10-win10-uwp-win2d-使用-Path-绘制界面
    2018-8-10-win10-uwp-win2d-使用-Path-绘制界面
    PHP money_format() 函数
    PHP metaphone() 函数
    PHP md5_file() 函数
    PHP md5() 函数
    PHP ltrim() 函数
    查看统计信息
    CF960F Pathwalks_权值线段树_LIS
    hdu 5691 Sitting in line 状压动归
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7087200.html
Copyright © 2011-2022 走看看