当前位置: 首页 > news >正文

any/all 子查询优化规则的原理与解析 | OceanBase查询优化

背景

在通常情况下,当遇到包含any/all子查询的语句时,往往需要遵循嵌套执行的方式,因此其查询效率较低。Oceanbase中制定了相应的any/all子查询优化规则,能够能够识别并优化符合条件的any/all子查询,从而有效提升查询的性能。

any/all子查询优化规则的基本原理

any/all子查询优化规则主要包含对以下两种情况的处理:

  1. min/max改写:当any/all子查询的表达式类型为比较运算符时,将子查询改写为min/max聚合子查询。
  2. any/all消除:当any/all子查询的内容为单个表达式时,将any/all子查询转换为普通子查询,在simplify规则执行时会消除该子查询。

min/max改写

考虑如下情况:

SELECT * FROM t1 WHERE c1 > ALL(SELECT c1 FROM t2) 

上述例子在默认情况下,需要按照嵌套的方式执行,即对父查询中的每一条记录,都需要判断是否满足子查询中的条件。结合该语句的语义,可以将子查询条件进行如下改写:

SELECT * FROM t1 WHERE c1 > ALL(SELECT max(c1) FROM t2)

经过改写后,子查询被转换成了聚合子查询。在实际执行时,可以将子查询先行聚合,然后将得到的结果用于父查询的过滤,从而大大提升了查询效率。

any/all消除

考虑如下情况:

SELECT * FROM t1 WHERE c1 > ALL(SELECT 100)

上述例子中的子查询为单表达式,可以移除any/all,如下所示:

SELECT * FROM t1 WHERE c1 > (SELECT 100)

在simpify规则执行时,会进一步消除子查询。

代码解析

any/all子查询优化规则的入口为ObTransformSubqueryCoalesce::transform_one_stmt,该函数最终调用do_transform_any_all函数进行优化,执行流程如下:

  1. 调用transform_any_all_as_min_max函数对any/all子查询语句进行min/max改写。
  2. 调用eliminate_any_all_before_subquery函数将单表达式的any/all子查询转化为普通子查询。

transform_any_all_as_min_max函数负责将any/all子查询改写为聚合子查询,能够被改写的子查询需要满足如下条件:

  1. 子查询对应的表达式必须为>,>=,<,<=中的一种。
  2. 子查询必须只包含一个select列,且该列需要属于某个索引前缀。
  3. 如果子查询为all类型,则select列必须为非空列。

该函数最终调用do_transform_any_all_as_min_max函数进行改写,该函数主要将select列替换成对应列的min/max表达式,对于all类型的子查询,需要额外添加having非空条件,如下所示:

having max/min(col) is not null

eliminate_any_all_before_subquery函数负责将单表达式的any/all子查询转换为普通子查询,该函数执行逻辑较为简单,这里不再赘述。


OceanBase 云数据库现已支持免费试用,现在申请,体验分布式数据库带来全新体验吧 ~

http://www.lryc.cn/news/506252.html

相关文章:

  • ECharts 饼图:数据可视化的重要工具
  • 第10章:CSS最佳实践 --[CSS零基础入门]
  • 怎么在idea中创建springboot项目
  • 递归读取指定目录下的文件
  • 【模型压缩】原理及实例
  • 常用的JVM启动参数有哪些?
  • Curvelet 变换与FDCT
  • Django Admin 管理工具
  • Android笔记【19】
  • 矩阵在资产收益(Asset Returns)中的应用:以资产回报矩阵为例(中英双语)
  • Docker 中如何限制CPU和内存的使用 ?
  • 【AIGC-ChatGPT进阶提示词-《动图生成》】怪物工厂:融合想象力与创造力的奇幻世界
  • docker 使用 xz save 镜像
  • C#经典算法面试题
  • vulnhub靶场【DriftingBlues】之9 final
  • 有124个叶子节点的,完全二叉树最多有多少个节点
  • 从RNN到Transformer:生成式AI自回归模型的全面剖析
  • Java爬虫大冒险:如何征服1688商品搜索之巅
  • 基于Spring Boot的无可购物网站系统
  • 智能人家谱程序创意
  • Redis 7.x哨兵模式如何实现?基于Spring Boot 3.x版
  • 解决QTCreator在Debug时无法显示std::string类型的问题
  • leetcode 面试经典 150 题:无重复字符的最长子串
  • 0101多级nginx代理websocket配置-nginx-web服务器
  • 【前端】Jquery拍照,通过PHP将base64编码数据转换成PNG格式,并保存图像到本地
  • websocket再项目中的使用
  • ajax同步执行async:false无效的解决方法
  • 基于Qt的登陆界面设计
  • HarmonyOS 输入框组件:TextInput 和 TextArea 深度解析
  • 【Golang】 Go 语言中的 Struct、JSON 和 Map 互转:详细指南