斷點

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

          oracle中的 exists 和 in 的效率問題

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

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

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

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

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

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

          exists 用法:

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

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

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

          in的用法:

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

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

          +++++++++++++   下面轉載  +++++++++++++++++++

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

          今天市場報告有個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個表的記錄數都不小,均在百萬左右。根據這種情況,我想到了前不久看的tom的一篇文章,說的是exists和in的區別,in 是把外表和那表作hash join,而exists是對外表作loop,每次loop再對那表進行查詢。
          這樣的話,in適合內外表都很大的情況,exists適合外表結果集很小的情況。

          而我目前的情況適合用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’
          )

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

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


          posted @ 2009-02-01 17:54 斷點 閱讀(240) | 評論 (0)
          主站蜘蛛池模板: 上饶县| 平乡县| 根河市| 西华县| 海伦市| 新和县| 阿尔山市| 平远县| 阿巴嘎旗| 肥东县| 卓尼县| 佛教| 博客| 本溪| 息烽县| 佛坪县| 德钦县| 安陆市| 沂水县| 平阳县| 循化| 鸡西市| 唐海县| 南华县| 上高县| 车致| 米易县| 珲春市| 专栏| 句容市| 三亚市| 深水埗区| 永兴县| 芷江| 化德县| 宁海县| 宝丰县| 拉孜县| 察隅县| 富宁县| 筠连县|