斷點

          每天進步一點點!
          posts - 174, comments - 56, trackbacks - 0, articles - 21

          oracle中的 exists 和 in 的效率問題

          Posted on 2010-01-14 21:42 斷點 閱讀(301) 評論(0)  編輯  收藏 所屬分類: Oracle

          有兩個簡單例子,以說明 “exists”和“in”的效率問題

          1) select * from T1 where exists(select * from T2 where T1.a=T2.a) ;

              T1數(shù)據(jù)量小而T2數(shù)據(jù)量非常大時,T1<<T2 時,1) 的查詢效率高。

          2) select * from T1 where T1.a in (select T2.a from T2) ;

               T1數(shù)據(jù)量非常大而T2數(shù)據(jù)量小時,T1>>T2 時,2) 的查詢效率高。

          exists 用法:

          1)句中的“select * from T2 where T1.a=T2.a” 相當于一個關(guān)聯(lián)表查詢,

               相當于“select * from T1,T2  where T1.a=T2.a”;

              “exists(xxx)”它只在乎括號里的數(shù)據(jù)能不能查找出來,是否存在這樣的記錄,如果存在,這1)句的where 條件成立。

          in的用法:

          2)句中的“select * from T1 where T1.a in (select T2.a from T2) ”,這里的“in”后面括號里的語句搜索出來的字段的內(nèi)容一定要相對應(yīng),一般來說,T1和T2這兩個表的a字段表達的意義應(yīng)該是一樣的,否則這樣查沒什么意義。

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

          +++++++++++++   下面轉(zhuǎn)載  +++++++++++++++++++

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

          今天市場報告有個sql及慢,運行需要20多分鐘,如下:
          update p_container_decl cd
          set cd.ANNUL_FLAG=\'0001\',ANNUL_DATE = sysdate
          where exists(
          select 1
          from (
          select tc.decl_no,tc.goods_no
          from p_transfer_cont tc,P_AFFIRM_DO ad
          where tc.GOODS_DECL_NO = ad.DECL_NO
          and ad.DECL_NO = \'sssssssssssssssss\'
          ) a
          where a.decl_no = cd.decl_no
          and a.goods_no = cd.goods_no
          )
          上面涉及的3個表的記錄數(shù)都不小,均在百萬左右。根據(jù)這種情況,我想到了前不久看的tom的一篇文章,說的是exists和in的區(qū)別,in 是把外表和那表作hash join,而exists是對外表作loop,每次loop再對那表進行查詢。
          這樣的話,in適合內(nèi)外表都很大的情況,exists適合外表結(jié)果集很小的情況。

          而我目前的情況適合用in來作查詢,于是我改寫了sql,如下:
          update p_container_decl cd
          set cd.ANNUL_FLAG=\'0001\',ANNUL_DATE = sysdate
          where (decl_no,goods_no) in
          (
          select tc.decl_no,tc.goods_no
          from p_transfer_cont tc,P_AFFIRM_DO ad
          where tc.GOODS_DECL_NO = ad.DECL_NO
          and ad.DECL_NO = ‘ssssssssssss’
          )

          讓市場人員測試,結(jié)果運行時間在1分鐘內(nèi)。問題解決了,看來exists和in確實是要根據(jù)表的數(shù)據(jù)量來決定使用。

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


          posted @ 2009-02-01 17:54 斷點 閱讀(240) | 評論 (0)
          主站蜘蛛池模板: 东莞市| 石泉县| 长白| 五原县| 于都县| 辛集市| 高密市| 子洲县| 塔河县| 姚安县| 肥乡县| 岳普湖县| 微山县| 中方县| 陇川县| 察隅县| 嵩明县| 聂荣县| 永登县| 民县| 阿克| 荆州市| 丽江市| 福州市| 大名县| 百色市| 亳州市| 兴义市| 高平市| 铅山县| 平安县| 抚松县| 隆安县| 伊通| 阜平县| 昔阳县| 房产| 枣强县| 全椒县| 胶州市| 瑞金市|