SQL 优化的过程可以分为逻辑优化和物理优化两个部分。逻辑优化主要是基于规则的优化,简称 RBO(Rule-Based Optimization)。物理优化会为逻辑查询计划中的算子选择某个具体的实现,需要用到一些统计信息,决定哪一种方式代价最低,所以是基于代价的优化 CBO(Cost-Based Optimization)。

优化器是开务数据库中的一个核心的模块,开务数据库使用优化器来完成对 SQL 语句优化并得到最优的逻辑计划,开务数据库里的优化器分为 RBO 和 CBO 两个阶段。

RBO 是基于规则的优化,这些规则背后的原理是关系代数的等价变换,其中典型的规则包括:列剪裁,谓词下推等。RBO 将内置的规则作为优化的基础,同时这些规则是硬编码在开务数据库的代码中的,RBO 会根据这些规则从目标 SQL 诸多可能的代数转换中选择一条来作为逻辑计划。

开务数据库的 RBO 优化器采用了 Optgen 语言编写,它提供了一种直观的语法来定义、匹配和替换目标表达式树中的节点。优化器规则的编写便是基于这种语言,使用 Optgen 语言可以很容易实现 RBO 规则。

开务数据库的 RBO 规则实现如下图所示,①被称为匹配模式,②被称为替换模式,优化器规则是某表达式满足①模式,然后转化为②模式的表达式。

①的匹配模式又分为三部分,第一部分中括号内是规则的名称,在 Opt 文件编译时会作为规则的标识,第二部分是第二行左小括号后位规则作用域,在开务数据库内有明确的类型划分。编写规则时要清楚这条规则是针对哪种类型表达式发生作用,第三部分是剩下的规则部分,是规则的匹配条件。

模式①匹配条件是等值表达式,左孩子不是变量,右孩子是变量。这里的 NormalizeEq 是名称,Eq 是规则类型,针对等值表达式。模式②表示新构建一个等值表达式,只是与原表达式相比,左右孩子互换。示例:1=a => a=1

开务数据库内置了上百种 RBO 规则,支持大量的 SQL 语句的代数优化,包括传统的列裁剪、最大最小消除、投影消除、谓词下推等等,也包括一些复杂的 Join 等下推操作。TryDecorrelateGroupBy,这个规则的 OptGen 规则描述如下:

[TryDecorrelateGroupBy, Normalize]
(InnerJoin | InnerJoinApply$left:*$right:* &(HasOuterCols $right) &(GroupBy | DistinctOn$input:*$aggregations:*$groupingPrivate:*) &(IsUnorderedGrouping $groupingPrivate)$on:*$private:*
)
=>
(Select((OpName $right)(InnerJoinApply$newLeft:(EnsureKey $left)$input[]$private)(AppendAggCols$aggregationsConstAgg (NonKeyCols $newLeft))(AddColsToGrouping $groupingPrivate (KeyCols $newLeft)))$on
)

TryDecorrelateGroupBy 主要作用在 InnerJoin | InnerJoinApply 操作中,它将 Join“下推”到 GroupBy 运算符中,以尝试继续“挖掘”以找到并消除不必要的相关性。最终的希望是触发 DecorrelateJoin 规则,将 JoinApply 操作符转换为非 Apply Join 操作符。

SELECT left.x, left.y, input.*
FROM left
INNER JOIN LATERAL(SELECT COUNT(*) FROM input WHERE input.x = left.x GROUP BY c
) AS input
ON left.y = 10
=>
SELECT CONST_AGG(left.x), CONST_AGG(left.y), COUNT(*)
FROM left WITH ORDINALITY
INNER JOIN LATERAL(SELECT * FROM input WHERE input.x = left.x
) AS input
ON True
GROUP BY input.c, left.ordinality
HAVING left.y = 10

开务数据库采用了 Optgen 语言作为 RBO 规则的编写语言,通过上面的例子可以看出,按照既定模式添加完善 RBO 规则十分便捷,通过编译可以将规则嵌入到系统 RBO 规则框架中;后续会有更深入的关于 RBO 使用框架与大家分享,敬请期待!

SQL优化-RBO(Rule-Based Optimization)相关推荐

  1. oracle sql语句加速选项,Oracle SQL优化基本步骤

    本空间日志均为一种学习记录. ----------------该文章无法找到原创出自何处.若有侵范,请告知! 最近有尝试做SQL优化.一直不得要领,请逛到这里的高人提供一些优化实例(最好是有优化历程说 ...

  2. sql优化第一天,认识优化器和RBO中的等价改写SQL例子1

    oracle有两种优化器,一种是基于成本的优化器CBO,一种是基于规则的优化器RBO,早期的版本使用基于规则的RBO优化器.从oracle10 g开始起,CBO已经成为比较成熟的优化器,但是要对sql ...

  3. mysql cbo rbo_一个sql(cbo,rbo)语句的优化,谢谢

    有一个语句,使用了hint /*+rule+*/ 目前的执行计划如下: SQL_ID  2227h5k32vr2b, child number 0 -------------------------- ...

  4. Mysql rbo和cbo_oracle的优化——RBO和CBO简介以及optimizer_mode参数说明

    最近对oracle的优化比较感兴趣,所以想跟大家分享一下学习经验. 在oracle中,sql语句优化分成RBO(Rule-Based Optimization)基于规则的优化和CBO(Cost-Bas ...

  5. ORACLE-019:ORACLE常用SQL优化hint语句

    在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...

  6. ORACLE常用SQL优化hint语句

    在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...

  7. sql优化技巧_使用这些查询优化技巧成为SQL向导

    sql优化技巧 成为SQL向导! (Become an SQL Wizard!) It turns out storing data by rows and columns is convenient ...

  8. oracle sql优化指导,基于Oracle的sql优化(1)

    先创建表和索引 create table emp_temp as select * from emp; create index idx_mgr_temp on emp_temp(mgr); crea ...

  9. SQL优化器原理 - Auto Hash Join

    这是MaxCompute有关SQL优化器原理的系列文章之一.我们会陆续推出SQL优化器有关优化规则和框架的其他文章.添加钉钉群"关系代数优化技术"(群号11719083)可以获取最 ...

最新文章

  1. 使用 Electron 从协议处理器启动应用程序
  2. c# 遍历文件夹深度,C#遍历文件夹,直到找到正确的文件
  3. ITK:带有离散高斯滤波器的平滑图像
  4. PostgreSQL hstore 列性能提升一例
  5. mvc5控制器修改html,ASP.NET MVC Razor:如何在控制器动作中呈现Razor局部视图的HTML...
  6. mysql rs.next_JDBC结果集rs.next()注意事项
  7. 20211130:力扣第267周周赛(下)
  8. 重庆中职高考计算机专业试题,职业高中高考计算机专业试卷3答案
  9. 读《About Face 4 交互设计精髓》10
  10. 计算机修改人类记忆曲线,Memory Helper
  11. 一个量化交易员的日常:屌丝版VS土豪版
  12. 树莓派基础实验38:逻辑分析仪分析PWM、UART信号
  13. android+widget日历开发,安卓日历小部件源码(AppWidgetProvider)
  14. 移动硬盘更改驱动器号和路径_如何在Windows 10中更改默认硬盘驱动器以保存文档和应用程序...
  15. python可以爬取58同城代码_爬取58同城—字体反爬
  16. 凡科自建网站有服务器吗,如何搭建网站服务器,有什么步骤?
  17. 教给论文投稿小白们去投哪些靠谱的国际学术会议
  18. 鼠标滚轮上下失灵的解决办法(机械编码器)
  19. 物联网系统RT-Thread学习---软件包使用(按键)
  20. shell “==“ vs.“-eq“

热门文章

  1. 美国政府CIO倡议创新大数据应用
  2. Linux 进程kill -9 无法杀死解决方案
  3. 多种方法助力小米(安卓)手机提升速度。
  4. 微信小程序 | 游戏开发之接宝石箱子游戏
  5. HBase在数据仓库中的应用
  6. dreamweaver4.0--9.0序列码全(学习参考)(仅供记忆用)
  7. iphone开发收藏3
  8. ChatGPT助力软件开发
  9. 6个月的大厂 面经,必须点赞!
  10. 微型计算机转移指令,微机原理与接口技术:转移指令