none
SQL in和exists哪个效率高??select 可以用 if吗?? RRS feed

  • 问题

  • 问题1:

    A:语句

    select OrderNo,SiteCode,AreaCode

    from SchedulingProgram

    where AreaCode in('P','M')and SiteCode in( 

    select SiteCode from EnvBasicInfo

    where cityiD=31) and OrderNo not in(select OrderNo from KK_DeliveryinfoTmp)

    B:语句

    select  OrderNo,SiteCode,AreaCode

    from SchedulingProgram

    where (AreaCode in('P','M')

    and SiteCode in( 

    select SiteCode from EnvBasicInfo

    where cityiD=31)) and not exists (

    select OrderNo from KK_DeliveryinfoTmp

    where KK_DeliveryinfoTmp.OrderNo=SchedulingProgram.OrderNo )

    上面的两条语句A语句和B语句哪条语句效率高??为什么

    问题2:

    还有查询语句可以用 if 吗?

    如: if(exists (select ....))

    begin

    select ....

    end

    2013年8月13日 5:19

答案

  • 1.建议EXISTS,很多时候其实性能没什么差别的

    2.可以用IF。

    2012种还可以用IIF


    Please Mark As Answer if it is helpful.

    2013年8月13日 6:42
  • 其实LZ可以自己做测试的

    --in和exists哪个效率高
    
    USE [GPOSDB]
    GO
    DBCC DROPCLEANBUFFERS
    GO
    DBCC FREEPROCCACHE
    GO
    SET STATISTICS IO ON
    GO
    SET STATISTICS TIME ON
    GO
    SET STATISTICS PROFILE ON
    GO
    SELECT * FROM [dbo].[CT_FuelingData] WHERE [VC_FD_Cardno] IN (SELECT [VC_IC_CardNO] FROM [dbo].[CT_InhouseCard])
    
    -----------------------------------------------------------------------
    
    USE [GPOSDB]
    GO
    DBCC DROPCLEANBUFFERS
    GO
    DBCC FREEPROCCACHE
    GO
    SET STATISTICS IO ON
    GO
    SET STATISTICS TIME ON
    GO
    SET STATISTICS PROFILE ON
    GO
    SELECT * FROM [dbo].[CT_FuelingData] WHERE EXISTS (SELECT [VC_IC_CardNO] FROM [dbo].[CT_InhouseCard] WHERE [dbo].[CT_FuelingData].[VC_FD_Cardno]=[dbo].[CT_InhouseCard].[VC_IC_CardNO])
    

    2013年8月13日 10:25
  • 从实际的执行来比较, 基本上都是一样的效率

    从功能上来讲, in 只能 in 单列, exists 可以多列判断

    2013年8月19日 13:08

全部回复

  • 你好 

    1. EXISTS 效率高

    2. 在select 中只能使用case when,不能使用if。可以在语句外使用IF。

    2013年8月13日 6:24
  • 1.建议EXISTS,很多时候其实性能没什么差别的

    2.可以用IF。

    2012种还可以用IIF


    Please Mark As Answer if it is helpful.

    2013年8月13日 6:42
  • 其实LZ可以自己做测试的

    --in和exists哪个效率高
    
    USE [GPOSDB]
    GO
    DBCC DROPCLEANBUFFERS
    GO
    DBCC FREEPROCCACHE
    GO
    SET STATISTICS IO ON
    GO
    SET STATISTICS TIME ON
    GO
    SET STATISTICS PROFILE ON
    GO
    SELECT * FROM [dbo].[CT_FuelingData] WHERE [VC_FD_Cardno] IN (SELECT [VC_IC_CardNO] FROM [dbo].[CT_InhouseCard])
    
    -----------------------------------------------------------------------
    
    USE [GPOSDB]
    GO
    DBCC DROPCLEANBUFFERS
    GO
    DBCC FREEPROCCACHE
    GO
    SET STATISTICS IO ON
    GO
    SET STATISTICS TIME ON
    GO
    SET STATISTICS PROFILE ON
    GO
    SELECT * FROM [dbo].[CT_FuelingData] WHERE EXISTS (SELECT [VC_IC_CardNO] FROM [dbo].[CT_InhouseCard] WHERE [dbo].[CT_FuelingData].[VC_FD_Cardno]=[dbo].[CT_InhouseCard].[VC_IC_CardNO])
    

    2013年8月13日 10:25
  • --使用EXISTS

    SQL Server 执行时间:
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 125 毫秒。

    (167 行受影响)
    表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'CT_FuelingData'。扫描计数 1,逻辑读取 31 次,物理读取 1 次,预读 56 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'CT_InhouseCard'。扫描计数 1,逻辑读取 2 次,物理读取 1 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

    (4 行受影响)

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

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


    --使用IN

    SQL Server 执行时间:
       CPU 时间 = 31 毫秒,占用时间 = 240 毫秒。
    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。


    SQL Server 执行时间:
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 64 毫秒。

    (167 行受影响)
    表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'CT_FuelingData'。扫描计数 1,逻辑读取 31 次,物理读取 1 次,预读 56 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'CT_InhouseCard'。扫描计数 1,逻辑读取 2 次,物理读取 1 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

    (4 行受影响)

    SQL Server 执行时间:
       CPU 时间 = 0 毫秒,占用时间 = 174 毫秒。
    2013年8月13日 10:26
  • 两个的执行计划

    IO和执行计划都一样,执行计划里都用了半连接,开销也一样,只是使用时间有些不一样

    当然表里的数据跟统计信息,还有索引这些因素在内,时间不一样是正常的

    所以in和exists的效率基本上是一样的

    2013年8月13日 10:30
  • 第二个问题 可以用if的

    USE [GPOSDB]
    GO
    IF ( EXISTS ( SELECT    [ParaValue]
                  FROM      [dbo].[SystemPara]
                  WHERE     [RecordNo] = 10 ) ) 
        BEGIN
    
            SELECT  *
            FROM    [dbo].[SystemPara]
    
        END

    2013年8月13日 10:33
  • 从实际的执行来比较, 基本上都是一样的效率

    从功能上来讲, in 只能 in 单列, exists 可以多列判断

    2013年8月19日 13:08
  • 从实际的执行来比较, 基本上都是一样的效率

    从功能上来讲, in 只能 in 单列, exists 可以多列判断

    只能in单列是什么意思?
    2013年8月23日 12:36