zoukankan      html  css  js  c++  java
  • SQL Server 执行计划操作符详解(2)——串联(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,在后续再介绍。

  • 相关阅读:
    MVC @Url.Action 小示例
    Eclipse快捷键
    MVC视频下载/文件上传
    MySQL数据库备份/导出
    C#文件下载
    C#正则表达式匹配字符串中的数字
    常用的LINQ to SQL 用法
    C# 实现抓取网页内容(一)
    C# 繁体字和简体字之间的相互转换
    我到底会什么??
  • 原文地址:https://www.cnblogs.com/binghou/p/9140264.html
Copyright © 2011-2022 走看看