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

    其生成的执行计划为:

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

  • 相关阅读:
    解决"waitForCondition(LockCondition) timed out (identity=23, status=0). CPU may be pegged. trying again."问题
    解决:“MediaPlayer error (1, -2147483648)”问题
    EasyUI 验证
    ANT简明教程[转载]
    [转]Android开源框架ImageLoader的完美例子
    [转]Android精品开源项目整理
    【转】25个非常实用的jQuery/CSS3应用组件
    [转]8款实用的jQuery/CSS3最新插件应用
    解决IE6下浮层遮盖select刺穿的问题
    jQuery AJAX中文乱码处理
  • 原文地址:https://www.cnblogs.com/TeyGao/p/5580848.html
Copyright © 2011-2022 走看看