赞
踩
前言:在以往的ORACLE SQL调优经验中,很多sql高手建议在系统中执行exists禁用in,很多新手也默认的接受了这个观点,
本文就是通过实验来对这个观点进行验证来进行验证;
准备工作:
1、创建测试表
在schemeas hr下面,创建表A1
脚本:create table A1 as select * from all_objects;
创建表B1
脚本:CREATE TABLE HR.B1 ( ID NUMBER);
插入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');
执行计划如下:
exists测试:
脚本:
selecte.*
fromhr.a1 e
whereexists
(select1 from hr.b1 d
wheree.object_id=d.id and d.id='100');
执行计划如下:
结论一:以上两个执行计划中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');
执行计划
not exists的测试
脚本:
selecte.*
fromhr.a1 e
wherenot exists
(select1 from hr.b1 d
wheree.object_id=d.id and d.id='100');
执行计划
结论二:以上两个执行计划中in和exists是一样的,两张表都做HASH JOIN SEMI,两个解析的hash values都是2184141079。
疑问:既然数据库存在in和exists的语法,从技术管理的角度上面来说,既然存在不一样,那么肯定是有存在的原因;
本文中测试的过程中A1表从3千的数据增加到3百万,表B1的数据从10条增加到3百万条,整个的执行计划都没有改变;
---------------------------------------------------------------------------------------------------------------
博客编写:吴志强 ORACLE 技术交流群:367875324
---------------------------------------------------------------------------------------------------------------
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。