当前位置:   article > 正文

oracle exists 性能,ORACLE 11G in exists的执行效率分析

oracle中exists的性能

前言:在以往的ORACLE SQL调优经验中,很多sql高手建议在系统中执行exists禁用in,很多新手也默认的接受了这个观点,

本文就是通过实验来对这个观点进行验证来进行验证;

准备工作:

1、创建测试表

在schemeas hr下面,创建表A1

脚本:create table A1  as select * from all_objects;

1ca9ada6f28331599f97f9ce5ebfb22b.png

创建表B1

脚本:CREATE TABLE HR.B1 (  ID  NUMBER);

078d27aa8f0f91abc6c58926cd4a2d1f.png

插入100条数据

脚本:

begin

for i in 1..100 loop

insert into hr.wu values(i);

if mod(i,100)=0 then

commit;

end if;

end loop;

end;

/

2、in和exists原理及性能实验测试

in测试:

脚本:

selecte.*

fromhr.a1 e

wheree.object_id in

(selectd.id from hr.b1 d where d.id='100');

执行计划如下:

6e5052ab77c652f253bdc0dc72f73fe2.png

exists测试:

脚本:

selecte.*

fromhr.a1 e

whereexists

(select1 from  hr.b1 d

wheree.object_id=d.id and d.id='100');

执行计划如下:

e9a67194c480616f6fc3d8cd16014cf5.png

结论一:以上两个执行计划中in和exists是一样的,两张表都做HASH JOIN SEMI,两个解析的hash values都是560281509。

3、not in 和not exists 的性能测试

not in的测试

脚本:

selecte.*

fromhr.a1 e

wheree.object_id not in

(selectd.id from hr.b1 d where d.id='100');

执行计划

57ae5ff24ff0567add45959f4b3afed0.png

not exists的测试

脚本:

selecte.*

fromhr.a1 e

wherenot exists

(select1 from  hr.b1 d

wheree.object_id=d.id and d.id='100');

执行计划

edb440f4075c061b37b51ef59a1260be.png

结论二:以上两个执行计划中in和exists是一样的,两张表都做HASH JOIN SEMI,两个解析的hash values都是2184141079。

疑问:既然数据库存在in和exists的语法,从技术管理的角度上面来说,既然存在不一样,那么肯定是有存在的原因;

本文中测试的过程中A1表从3千的数据增加到3百万,表B1的数据从10条增加到3百万条,整个的执行计划都没有改变;

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

博客编写:吴志强                                                                                  ORACLE 技术交流群:367875324

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/480012
推荐阅读
相关标签
  

闽ICP备14008679号