25 union代替or --优化主题系列

当SQL语句中 or条件上面有一个为子查询 这个时候就可以用union代替or或者你发现执行计划中的filter有or 并且or后面跟上子查询EXISTS(select...)的时候就要注意 比如:


当然了 当你看到operation中的filter也应该要注意这些

看到filter后有orexists(select xx)  则改成union

 

示例如下(请自己动手实验):
create table test1 as select * from dba_objects;

createtable test2 as select * from dba_objects;

createindex idx1 on test1(object_id);

createindex idx2 on test1(owner);

createindex idx3 on test2(object_id);

createindex idx4 on test2(owner);

BEGIN

  DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'SCOTT',

                                tabname          => 'TEST1',

                               estimate_percent => 100,

                                method_opt       => 'for  columns owner size 200',

                               no_invalidate    => FALSE,

                                degree           => 1,

                                cascade          => TRUE);

END;

/

BEGIN

  DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'SCOTT',

                                tabname          => 'TEST2',

                               estimate_percent => 100,

                                method_opt       => 'for  columns owner size 200',

                               no_invalidate    => FALSE,

                                degree           => 1,

                                cascade          => TRUE);

END;

/

select* from test1 where owner='SCOTT' or object_id in(select object_id from test2where owner='SCOTT');


select* from test1 where owner='SCOTT'

union

select* from test1 where object_id in(select object_id from test2 whereowner='SCOTT');


逻辑读从184742到1221



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值