sql中union多表合并mysql⽤union替换or_SQL优化案例-union代替or(九)随着Oracle版本的提升,优化器更趋向于智能,⽐如,12c中的标量⼦查询被transform成外连接。
select (select max(object_id) from test2 b where b.object_id =a.object_id) from test1 a;
11g中执⾏计划如下:
进⼊正题,当SQL中同时有or和⼦查询时,这种情况下查询⽆法展开(unnest),遇到这种情况只能改SQL来改变执⾏计划,并且在12c或18c中都没有智能改写。
select * from test1 where owner = 'SCOTT' or object_id in (select object_id from test2);
在不改写SQL的情况下我们在test2的join列上建⽴索引
create index idx_objid on test2(object_id);
下⾯⽤union改写sql
select * from test1 where owner = 'SCOTT' union select * from test1 where object_id in (select object_id from test2);
案例较为简单,希望通过此案例让⼤家了解优化器的⼀些⾏为,和unnest产⽣filter的⼀些情形。
| 作者简介
姚崇·沃趣科技⾼级数据库技术专家
熟悉Oracle、MySQL数据库内部机制,丰富的Oracle、MySQL故障诊断、性能调优、数据库备份恢复、复制、⾼可⽤⽅案及迁移经验。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论