zoukankan      html  css  js  c++  java
  • 曲演杂坛--EXISTS语句

    通常在我写EXISTS语句时,我会写成IF EXISTS(SELECT TOP(1) 1 FROM XXX),也没细细考究过为什么要这么写,只是隐约认为这样写没有啥问题,那今天就深究下吧!

    首先准备测试测试数据

    USE [TestDB1]
    GO
    CREATE TABLE TB1001
    (
        ID INT IDENTITY(1,1),
        C1 VARCHAR(200),
        CONSTRAINT PK_TB1001_ID PRIMARY KEY(ID)
    )
    GO
    CREATE INDEX IDX_ID ON TB1001(ID)
    
    GO
    INSERT INTO TB1001(C1)
    SELECT name FROM sys.columns
    GO

    其中需要注意下索引IDX_ID, 虽然ID已经是主键索引,但仍创建一个非聚集索引以供后续测试。

    通常我们在写EXISTS语句时,一个纠结点是要不要使用TOP,另外一个纠结点是SELECT 语句中的返回列,因此构造测试语句如下:

    IF EXISTS(SELECT 1 FROM [dbo].[TB1001] WHERE ID>10)
    BEGIN
        PRINT 1
    END
    
    IF EXISTS(SELECT TOP(1) 1 FROM [dbo].[TB1001] WHERE ID>10)
    BEGIN
        PRINT 1
    END
    
    IF EXISTS(SELECT TOP(10) 1 FROM [dbo].[TB1001] WHERE ID>10)
    BEGIN
        PRINT 1
    END
    
    IF EXISTS(SELECT * FROM [dbo].[TB1001] WHERE ID>10)
    BEGIN
        PRINT 1
    END
    
    IF EXISTS(SELECT ID FROM [dbo].[TB1001] WHERE ID>10)
    BEGIN
        PRINT 1
    END
    
    IF EXISTS(SELECT C1 FROM [dbo].[TB1001] WHERE ID>10)
    BEGIN
        PRINT 1
    END

    以上语句各种写法,但最终生成的执行计划都一样,因此执行效率也一样:

    对于IF EXISTS(SELECT C1 FROM [dbo].[TB1001] WHERE ID>10)语句,索引IDX_ID并没有包含C1列的数据,但查询仍使用IDX_ID索引,证明查询并不需要访问C1列的数据

    从上面的操作运算符来看,可以得到以下两个结论:

    1. 无论是TOP(1)还是TOP(10)或不使用TOP,执行计划中都没有TOP的操作,即使SQL语句中写明TOP(1)也会被忽略,因此TOP并不影响生成执行计划;

    2. 无论使用SELECT 1 或者使用SELECT * 又或者使用SELECT C1 等,运算符都没有返回列信息(OUTPUT LIST), 即EXISTS并不关心返回数据的内容,只关心有没有数据,因此SELECT部分的内容也不影响生成执行计划;

    --========================================================

     PS: Seek Keys[1] 并不代表只返回一行数据,如对于查询:

    SELECT TOP(10) * FROM [dbo].[TB1001] WHERE ID>10

    其生成的执行计划为:

    ================================================

  • 相关阅读:
    SSIS ->> Excel Destination无法接受大于255个字符长度的字符字段(转载)
    在express站点中使用ejs模板引擎
    Kali Linux系列教程之OpenVas安装
    Kali Linux Web 渗透测试视频教程— 第二课 google hack 实战
    Kali Linux Web 渗透测试视频教程— 第四课 google hack 实战
    google hack 之 查询语法
    shellKali Linux Web 渗透测试— 初级教程(第三课)
    NODE-WEBKIT教程(12)全屏
    node-webkit教程(11)Platform Service之shell
    node-webkit教程(10)Platform Service之File dialogs
  • 原文地址:https://www.cnblogs.com/TeyGao/p/5580848.html
Copyright © 2011-2022 走看看