SQL 子查询关联查询和非关联查询 性能分享

今天做在写SQL时候发现有需要优化的SQL 语句,特拿出来和大家 分享一下:

查询一 

SELECT  SceneryId
FROM    TableBcst bcst WITH ( NOLOCK )
WHERE   bcst.PayMode = 1
        AND SceneryId NOT IN (
        SELECT  SceneryId
        FROM    TableBcst bcst WITH ( NOLOCK )
        WHERE   bcst.PayMode <> 1 )
 
查询二

SELECT DISTINCT
        bcst1.SceneryId
FROM    TableBcst bcst1 WITH ( NOLOCK )
WHERE   bcst1.PayMode = 1
        AND NOT EXISTS ( SELECT SceneryId
                         FROM   [TableBcst bcst2 WITH ( NOLOCK )
                         WHERE  bcst2.SceneryId = bcst1.SceneryId
                                AND ( bcst2.PayMode > 1
                                      OR bcst2.PayMode < 1
                                    ) )
查询 三
SELECT DISTINCT
        bcst1.SceneryId
FROM    TableBcst bcst1 WITH ( NOLOCK )
WHERE   bcst1.PayMode = 1
        AND bcst1.SceneryId NOT IN (
        SELECT  SceneryId
        FROM    TableBcst bcst2 WITH ( NOLOCK )
        WHERE   bcst2.SceneryId = bcst1.SceneryId
                AND ( bcst2.PayMode > 1
                      OR bcst2.PayMode < 1
                    ))

以上三条语句查询结果是相同的,让我们在看看查询数据库统计结果如下:

前提条件是:如查询一,外查询的数据结果集只有子查询数据结果集的1%

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
SET STATISTICS IO ON  

SET STATISTICS TIME ON 


统计结果如下:由于本人数据没有权限清除缓存区,所以部分数据不准确。

查询一

 -------------------------------------------------------------------------------------------------      

SQL Server 分析和编译时间: 
   CPU 时间 = 12 毫秒,占用时间 = 12 毫秒。

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(20 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
TableBcst '。扫描计数 2,逻辑读取 364 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 '

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 4 毫秒。

 

查询二 

 ---------------------------------------------------------------------------------------------

SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 8 毫秒。
 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
(20 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Tablebcst'。扫描计数 2,逻辑读取 364 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 4 毫秒。

查询三

------------------------------------------------------------------------------------------------------------------- 

SQL Server 分析和编译时间: 
   CPU 时间 = 12 毫秒,占用时间 = 12 毫秒。
 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
(20 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'TableBcst'。扫描计数 2,逻辑读取 364 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
 SQL Server 执行时间:
   CPU 时间 = 15 毫秒,占用时间 = 4 毫秒。

看看以上结果,也许有时候理论知识需要和实际情况相比较才能得出结论,在SQL Server 数据库技术内幕中理论也许你看过吧,有时候还是要看具体情况来判断吧。不要被统计结果给蒙骗了,因为数据量少,统计数据准确性不搞,今天下午刚好有空,抽时间和大家分享。


原文地址:https://www.cnblogs.com/andyyu/p/2263246.html