zoukankan      html  css  js  c++  java
  • SQL语句NOT IN优化之换用NOT EXISTS

    NOT IN查询示例(示例背景描述:根据条件查询Questions表得到的数据基本在PostedData表中不存在,为完全保证查询结果在PostedData表中不存在,使用NOT IN):

    SET STATISTICS PROFILE ON; 
    SET STATISTICS IO ON; 
    SET STATISTICS TIME ON; 
    GO
    /*--你的SQL脚本开始*/
    SELECT  A.Id
    FROM    dbo.Questions A WITH ( NOLOCK )
    WHERE   A.QuestionState = '正常'
            AND A.CheckTime > '2018-09-29 16:00:00'
            AND A.StateShowID NOT IN ( SELECT   B.IntId
                                       FROM     dbo.PostedData B
                                       WHERE    B.[Type] = 'question' );
    
    /*你的SQL脚本结束*/
    GO 
    SET STATISTICS PROFILE OFF;
    SET STATISTICS IO OFF;
    SET STATISTICS TIME OFF;

    查询耗时如图:

    换用NOT EXISTS 查询示例:

    SET STATISTICS PROFILE ON; 
    SET STATISTICS IO ON; 
    SET STATISTICS TIME ON; 
    GO
    /*--你的SQL脚本开始*/
    SELECT  A.Id
    FROM    dbo.Questions A WITH ( NOLOCK )
    WHERE   A.QuestionState = '正常'
            AND A.CheckTime > '2018-09-29 16:00:00'
            AND NOT EXISTS ( SELECT B.IntId
                             FROM   dbo.PostedData B
                             WHERE  B.[Type] = 'question'
                                    AND A.StateShowID = B.IntId );
    
    /*你的SQL脚本结束*/
    GO 
    SET STATISTICS PROFILE OFF;
    SET STATISTICS IO OFF;
    SET STATISTICS TIME OFF;

     查询耗时如图:

    根据查询耗时明显可以看出,使用 NOT EXISTS 比NOT IN 的查询速度快很多。

    But,我做了其他条件下的一些实验,发现根据条件查询A表得到的结果,在B表中存在时,两种查询的查询速度差异不大。还有一些情况NOT EXISTS的查询速度比NOT IN慢。

  • 相关阅读:
    Ubuntu搭建FTP服务器
    【wireshark】wireshark 出现There are no interfaces on which a capture can be done.的解决方法
    那些强悍的PHP一句话后门
    Ubuntu下SSH设置
    Servlet&JSP中的知识点
    String s=new String("abc")创建了几个对象?
    JavaEE的13种核心技术
    ++i和i++
    构造方法
    TCP/IP
  • 原文地址:https://www.cnblogs.com/mlinber/p/9729435.html
Copyright © 2011-2022 走看看