段落一:
select t1.uuid,t1.circuitcode,t1.belongcity,t2.label 
from res_circuit t1,
dt_region t2
where t1.belongcity=t2.cityid
and exists(
            select 1
            from 
            (
            select tt1.circuitcode,count(1) cnt 
            from res_circuit tt1
            group by tt1.circuitcode
            )tt2
            where cnt>1
            and tt2.circuitcode=t1.circuitcode
            )
order by t1.circuitcode段落二:
select t1.uuid,t1.circuitcode,t1.belongcity,t2.label,t1.aendroom,t1.zendroom 
from res_circuit t1,
dt_region t2
where t1.belongcity=t2.cityid
and t1.circuitcode in
                      (
                        select tt2.circuitcode
                        from 
                        (
                          select tt1.circuitcode,count(1) cnt 
                          from res_circuit tt1
                          group by tt1.circuitcode
                        )tt2
                        where cnt>1
                      )
order by t1.circuitcode第一段执行的很慢,几分钟还是没有结果,第二段不到一秒钟就出来了,速度相差非常大,照理说,in是没有exists快,但是这个为什么反常呢?哪位大侠解释一下。

解决方案 »

  1.   

    看情况
    IN :子查询来驱动父查询
    exist:父查询驱动子查询 
    所以如果子查询小的话,则可以采用in会快一些,如果子查询大的话,则采用exists会快一些。
      

  2.   

    not in, not exist则刚好相反。
    1楼总结的非常不错。
      

  3.   

    sql这样写会nest loop.试试下面的写法.
    SELECT t1.uuid, t1.circuitcode, t1.belongcity, t2.label
      FROM res_circuit t1,
           (SELECT tt1.circuitcode, COUNT(1) cnt
              FROM res_circuit tt1
             GROUP BY tt1.circuitcode) tt2 dt_region t2
     WHERE t1.belongcity = t2.cityid
       AND tt2.circuitcode = t1.circuitcode
       AND tt2.cnt >= 2
     ORDER BY t1.circuitcode;
      

  4.   

    SELECT t1.uuid, t1.circuitcode, t1.belongcity, t2.label
      FROM res_circuit t1,dt_region t2,
           (SELECT tt1.circuitcode, COUNT(1) cnt
              FROM res_circuit tt1
             GROUP BY tt1.circuitcode) tt2 
     WHERE t1.belongcity = t2.cityid
       AND tt2.circuitcode = t1.circuitcode
       AND tt2.cnt >= 2
     ORDER BY t1.circuitcode;
    少写了个','.
      

  5.   

    In和exists对比:
    若子查询结果集比较小,优先使用in,若外层查询比子查询小,优先使
    用exists。因为若用in,则oracle 会优先查询子查询,然后匹配外层查询,
    若使用exists,则oracle 会优先查询外层表,然后再与内层表匹配。最优化
    匹配原则,拿最小记录匹配大记录。
      

  6.   

    这样结果一样,好像还快了一点。但是有时候不能用这种写法代替in,exists。
      

  7.   

    这东西多年前就说了 没有绝对 的根据你的子查询的范围来定 
    大则 exists 否则 in