我在论坛上经常看到关于exsis与in效率的问题,大多数都说exsis比in效率高,昨天我把我的一个SQL2K的一个视图改了,原来用in的,现改为用exsis,同样的结果,数据只有4235行,用in不用1秒,用exsis耗时23秒.大侠们请分析分析:
用IN(耗时0.01秒):SELECT *
FROM dbo.判定结果
WHERE ((工程编号 + 项目编号) IN
          (SELECT b.工程编号 + b.项目编号
         FROM 判定结果 AS b
         GROUP BY b.工程编号, b.项目编号
         HAVING SUM(b.检测项数) > 0))用EXSIS(耗时23秒):SELECT *
FROM dbo.判定结果 a
WHERE EXISTS
          (SELECT 1
         FROM dbo.判定结果 AS b WHERE a.工程编号 + a.项目编号 = b.工程编号 + b.项目编号
         GROUP BY b.工程编号, b.项目编号
         HAVING SUM(b.检测项数) > 0
      )

解决方案 »

  1.   

    IF EXISTS()
    SELECT .....
    这样用的多些,个人感觉应该是EXISTS快,因为EXISTS是一搜索到有指定的条件,就马上执行下一个语句,而IN则要全部检索完才执行下一个语句.
      

  2.   

    另外,有可能和你的索引有关系.在有索引的情况下,SELECT *比SELECT COLUMN要快,可能这个对EXISTS有影响.
      

  3.   

    那些说exsis比in效率高的大侠请关注!
      

  4.   

    不要硬性理解EXISTS和IN那个快那个慢.该用什么用什么.
    "检测项数"不会是负数吧.所以这么改改试试.SELECT *
    FROM dbo.判定结果 a
    WHERE EXISTS
             (SELECT 1
             FROM dbo.判定结果 AS b 
             WHERE a.工程编号= b.工程编号 
             AND a.项目编号=b.项目编号    
             AND b.检测项数>0
          )同时"工程编号" "项目编号"有没有索引?
      

  5.   

    你如果条件这么一加: 
    a.工程编号 + a.项目编号 = b.工程编号 + b.项目编号 索引使用率就低了.
      

  6.   

    重发一次昨天的某个回贴.
    某些人对in的效率问题的认识进入了误区.SELECT * FROM t1 WHERE ID NOT IN(SELECT ID FROM t2)SELECT * FROM t1 a WHERE NOT EXISTS(SELECT 1 FROM t2 WHERE id = a.ID)SELECT * FROM t1 a WHERE ID NOT IN (SELECT b.ID FROM t2 b WHERE a.f1=b.f1)这三个语句,前面两个功能一样,但效率,你只有测试过才知道。
    第三个语句,功能跟前面两个不一样,我举它出来只是作比较用的.第一条语句 子查询 与外部表没有任何连接条件,那么SQL执行时,会将子查询的结果绶存起来, 也即子查询只执行一次.  当子查询语句比较复杂时,这非常有效.
    而第二、三种,查询时每对 t1 检索一条记录时都要执行一次子查询。随口说in(或者使用子查询)效率低是不合理的。