1. 首页
  2. IT资讯

ORACLE 11G in exists的执行效率分析

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

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

准备工作:

1、创建测试表

在schemeas hr下面,创建表A1

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

ORACLE 11G in exists的执行效率分析

创建表B1

脚本:CREATETABLEHR.B1(IDNUMBER)

ORACLE 11G in exists的执行效率分析

插入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.a1e

wheree.object_idin

(selectd.idfromhr.b1 dwhered.id=‘100’);

执行计划如下:

ORACLE 11G in exists的执行效率分析

exists测试:

脚本:

selecte.*

fromhr.a1e

where exists

(select1fromhr.b1 d

wheree.object_id=d.idandd.id=‘100’);

执行计划如下:

ORACLE 11G in exists的执行效率分析

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

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

not in的测试

脚本:

selecte.*

fromhr.a1e

wheree.object_idnotin

(selectd.idfromhr.b1 dwhered.id=‘100’);

执行计划

ORACLE 11G in exists的执行效率分析

not exists的测试

脚本:

selecte.*

fromhr.a1e

where notexists

(select1fromhr.b1 d

wheree.object_id=d.idandd.id=‘100’);

执行计划

ORACLE 11G in exists的执行效率分析

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

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

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

—————————————————————————————————————

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

—————————————————————————————————————

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29578568/viewspace-2136918/,如需转载,请注明出处,否则将追究法律责任。

主题测试文章,只做测试使用。发布者:布吉卡,转转请注明出处:http://www.cxybcw.com/195138.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code