查看原文
其他

SQL优化案例-union代替or(九)

姚崇·沃趣科技 沃趣技术 2023-03-10


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

出品  沃趣科技



随着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故障诊断、性能调优、数据库备份恢复、复制、高可用方案及迁移经验。

点击查看招聘信息


相关链接

sysbench花式采坑之二:自增值导致的主键冲突

SQL优化案例-单表分页语句的优化(八)

MySQL5.7中的sql_mode默认值

Kubernetes何时才会消于无形却又无处不在?

初相识 | 全方位认识 information_schema

沃趣微讲堂 | Oracle集群技术(四):集群初始化资源层

复制错误案例分享(二)

SQL优化案例-使用with as优化Subquery Unnesting(七)

MySQL分析函数实现

Pod挂载Volume失败问题分析

18C新特性之PDB snapshot Carousel,够用吗?


更多干货,欢迎来撩~

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存