您的位置:首页 > 数据库 > Oracle

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

2017-10-31 10:47 246 查看
当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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息