Oracleexists和in的使用技巧

文章作者 100test 发表时间 2007:10:24 13:15:03
来源 100Test.Com百考试题网



exists 和 in 使用一例
===========================================================
今天市场报告有个sql及慢,运行需要20多分钟,如下:
0update p_container_decl cd
set cd.ANNUL_FLAG=’0001’,ANNUL_DATE = sysdate
where exists(
0select 1
from (
0select 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,如下:
0update p_container_decl cd
set cd.ANNUL_FLAG=’0001’,ANNUL_DATE = sysdate
where (decl_no,goods_no) in
(
0select 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日期函数(DatetimeFunctio )
oracle字符型函数返回数字值
oracle转换函数(ConversionFunctio )
Oracleexists和in的使用技巧
使用dba_table acesANDdba_data_files查询表空间大小
Oracleto_char()函数的使用方法
Oracle连接远程数据库并远程执行DDL操作
Oracle中Decode()函数的使用方法
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛