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慢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM