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;

ac81c9b8f75d3cb73a800ab1c20196ca.png

11g中执行计划如下:

8f381dd5dc9a312ffb721afbf293be64.png

进入正题,当SQL中同时有or和子查询时,这种情况下查询无法展开(unnest),遇到这种情况只能改SQL来改变执行计划,并且在12c或18c中都没有智能改写。

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

b775c856fae8efd7f7089b2e98bb6228.png

在不改写SQL的情况下我们在test2的join列上建立索引

create index idx_objid on test2(object_id);

6244183a4758c3939c423083f76e7e17.png

下面用union改写sql

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

ed22f281e9e21d43509e8e6c0c3d5264.png

案例较为简单,希望通过此案例让大家了解优化器的一些行为,和unnest产生filter的一些情形。

|  作者简介

姚崇·沃趣科技高级数据库技术专家

熟悉Oracle、MySQL数据库内部机制,丰富的Oracle、MySQL故障诊断、性能调优、数据库备份恢复、复制、高可用方案及迁移经验。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值