半连接转内连接规则的原理与代码解析 |OceanBase查询优化

背景

在查询语句中,若涉及半连接(semi join)操作,由于半连接不满足交换律的规则,连接操作必须遵循语句中定义的顺序执行,从而限制了优化器根据参与连接的表的实际数据量来灵活选择优化策略的能力。为此,OceanBase中制定了半连接转内连接规则,该规则允许在满足特定条件的情况下,将半连接操作转换为内连接,为优化器进的一步优化提供了基础。

半连接转内连接规则的基本原理

考虑如下情况:

复制代码
SELECT * FROM t1 SEMI JOIN t2 on t1.c1 = t2.c1

我们可以将上述查询直接转为内连接,如下所示:

复制代码
SELECT t1.* FROM t1, t2 WHERE t1.c1 = t2.c1

这里可能存在一个问题,即当连接条件的右表部分(如t2.c1)不唯一时,在内连接执行时可能会造成左表记录被复制多份(即一条左表记录对应多条右表记录),从而违背原来的语义。因此仅当上述右表满足唯一条件时,才可以进行改写。

半连接转内连接规则代码解析

半连接转内连接规则的入口为ObTransformSemiToInner::transform_one_stmt ,该函数最终调用transform_semi_to_inner 函数执行改写。由于这项改写并不一定能够带来更好的执行开销,因此需要在改写完成后调用accept_transform函数判断是否接受改写结果。

transform_semi_to_inner 函数首先会调用check_basic_validity 函数判断查询语句是否满足改写条件,如果满足,则调用do_transform函数执行改写。

check_basic_validity函数负责判断指定的半连接是否可以被改写为内连接,能够被转换的半连接需要满足如下条件:

  1. 半连接的连接条件均为equal表达式。
  2. 满足以下两个条件中的一个:半连接条件的右表表达式对应唯一结果或可以通过视图查询转换为唯一结果;半连接位于某个exist/no_exist/any/all子查询中,此时由于转内连接造成的数据重复可以被忽略。

该函数首先调用check_semi_join_condition函数提取半连接条件的左右表达式集合,并判断是否所有条件都是equal条件,然后按照如下流程判断是否满足改写条件:

  1. 调用check_right_table_output_one_row函数判断右表是否为视图查询且添加了limit 1表达式,此时右表至多输出一行记录。
  2. 调用check_right_exprs_unique函数判断右表表达式是否对应唯一结果。
  3. 调用check_stmt_is_non_sens_dul_vals函数判断半连接语句是否位于某个exist/no_exist/any/all子查询中。
  4. 调用check_can_add_distinct 函数判断是否可以通过将右表转化为视图表,然后在视图查询中添加distinct的方式保证结果唯一。如果可以,则调用check_join_condition_match_index函数进一步检查左表条件是否与某个索引匹配(这里应该是性能上的考量)。

do_transform函数负责执行实际的改写操作,该函数执行逻辑较为简单。如果右表满足上述1,2,3项中的任意一项,则将右表添加到查询语句中的from部分即可(相当于隐式的inner join);如果满足第4项,则将右表转换为视图查询,然后将查询语句设置为distinct。


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

相关推荐
古月居GYH2 小时前
【数据分析】如何在PyCharm中高效配置和使用SQL
ide·sql·pycharm
程序员张39 小时前
SQL分析与打印-p6spy组件
spring boot·sql·mybatis·mybatisplus·p6spy
Edingbrugh.南空13 小时前
Flink OceanBase CDC 环境配置与验证
大数据·flink·oceanbase
丶意冷13 小时前
mybatisPlus分页方言设置错误问题 mybatisPlus对于Oceanbase的Oracle租户分页识别错误
java·数据库·oracle·oceanbase
RainbowSea19 小时前
15. MySQL 多版本并发控制
java·sql·mysql
唐可盐21 小时前
第六章 SQL编程系列-Gbase8a从入门到进阶
数据库·sql·gbase8a
DataGear1 天前
如何在DataGear 5.4.1 中快速制作SQL服务端分页的数据表格看板
javascript·数据库·sql·信息可视化·数据分析·echarts·数据可视化
数据狐(DataFox)1 天前
SQL参数化查询:防注入与计划缓存的双重优势
数据库·sql·缓存
先做个垃圾出来………2 天前
SQL的底层逻辑解析
数据库·sql
Lx3522 天前
MySQL物化视图:预计算查询结果的定期刷新
sql·mysql·性能优化