Oracle exists 和 in 的真正区别

in适合内外表都很大的情况,exists适合外表结果集很小的情况。

http://blog.itpub.net/category/385/14461

exists 和 in 使用一例
===========================================================
今天市场报告有个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确实是要根据表的数据量来决定使用。

##########oracle exists 用法############
例: select  * from emp_tax;
1: 内表必须要和外表连接。
       select *
       from emp_tax o
       where exists (select *
       from emp_tax i
       where i.empno = o.empno
       and i.empno < 0005);
2. exists 适合外表的结果集小的情况。因为exists是对外表作loop,每次loop再对那表进行查询。
    当 exists 中的 where 后面条件为真的时候则把前面select 的内容显示出来(外表的select ).
###################################
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mantisXF/archive/2007/07/05/1680282.aspx

posted @ 2009-07-25 10:00  WenEric  阅读(496)  评论(0编辑  收藏  举报