月掛夜中央

          懶惰程序員

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          oracle中in,not in和exists,not exists之間的區(qū)別

                   一直聽到的都是說盡量用exists不要用in,因?yàn)閑xists只判斷存在而in需要對(duì)比值,所以exists比較快,但看了看網(wǎng)上的一些東西才發(fā)現(xiàn)根本不是這么回事。
          下面這段是抄的
          Select * from T1 where x in ( select y from T2 )
          執(zhí)行的過程相當(dāng)于:
          select *
            from t1, ( select distinct y from t2 ) t2
           where t1.x = t2.y;

          select * from t1 where exists ( select null from t2 where y = x )
          執(zhí)行的過程相當(dāng)于:
          for x in ( select * from t1 )
             loop
                if ( exists ( select null from t2 where y = x.x )
                then
                   OUTPUT THE RECORD
                end if
          end loop

          從我的角度來說,in的方式比較直觀,exists則有些繞,而且in可以用于各種子查詢,而exists好像只用于關(guān)聯(lián)子查詢(其他子查詢當(dāng)然也可以用,可惜沒意義)。
          由于exists是用loop的方式,所以,循環(huán)的次數(shù)對(duì)于exists影響最大,所以,外表要記錄數(shù)少,內(nèi)表就無所謂了,而in用的是hash join,所以內(nèi)表如果小,整個(gè)查詢的范圍都會(huì)很小,如果內(nèi)表很大,外表如果也很大就很慢了,這時(shí)候exists才真正的會(huì)快過in的方式。
                   下面這段還是抄的
          not in 和not exists
          如果查詢語句使用了not in 那么內(nèi)外表都進(jìn)行全表掃描,沒有用到索引;
          而not extsts 的子查詢依然能用到表上的索引。
          所以無論那個(gè)表大,用not exists都比not in要快。
                    也就是說,in和exists需要具體情況具體分析,not in和not exists就不用分析了,盡量用not exists就好了。


          我的微博 http://t.sina.com.cn/1401900445

          posted on 2009-01-07 15:03 月掛夜中央 閱讀(6276) 評(píng)論(2)  編輯  收藏 所屬分類: SQL很強(qiáng)大

          評(píng)論

          # re: oracle中in,not in和exists,not exists之間的區(qū)別 2009-01-09 10:04 jyojyo

          in 語句翻譯成內(nèi)連接, 內(nèi)連接到最后還不是做loop?
          所以有區(qū)別嗎?  回復(fù)  更多評(píng)論   

          # re: oracle中in,not in和exists,not exists之間的區(qū)別 2009-01-12 08:30 月掛夜中央

          @jyojyo

          典型的連接類型共有3種:
          排序 - - 合并連接(Sort Merge Join (SMJ) )
          嵌套循環(huán)(Nested Loops (NL) )
          哈希連接(Hash Join)

          嵌套循環(huán)和哈希連接的算法還是有不同,在理論上哈希連接要快過排序和nl,當(dāng)然實(shí)際情況比理論上有復(fù)雜的多,不過兩者還是有差異的  回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 神木县| 比如县| 静宁县| 韶关市| 柯坪县| 思茅市| 克东县| 凯里市| 分宜县| 河北区| 博罗县| 阿尔山市| 新乐市| 鹰潭市| 平果县| 云南省| 连山| 大安市| 新民市| 当涂县| 鄱阳县| 阜宁县| 金门县| 东阳市| 铜陵市| 民和| 洛隆县| 大冶市| 安远县| 辽阳县| 龙江县| 广宗县| 榆中县| 南召县| 双鸭山市| 沙河市| 增城市| 宝鸡市| 望江县| 南雄市| 凤庆县|