一、RBO 背景介绍

RBO(Rule-Based Optimization,基于规则的优化器)有着一套严格的使用规则,按照 RBO 去写 SQL 语句,无论数据表中的内容怎样,也不会影响到你的“执行计划”。

换言之 RBO 对数据不“敏感”,它根据指定的优先顺序规则,对指定的表进行执行计划的选择。比如在规则中,索引的优先级大于全表扫描。RBO 是根据可用的访问路径以及访问路径等级来选择执行计划,在 RBO 中,SQL 的写法往往会影响执行计划。

二、Optgen 介绍

Optgen 是一种域细节语言 (DSL),它提供了一种直观的语法来定义、匹配、替换目标表达式树中的节点,优化器规则的编写便是基于这种语言。

代码中存在这样的模块:将 DSL 语言转化为真实的 go 语言(文件后缀 og.go),以便优化器调用。模块入口在 pkg/sql/opt/optgen/cmd/optgen/main.go 中的 func main(),这里暂不涉及,以下介绍中此模块简称“代码生成模块”。

三、RBO 规则介绍

RBO 涉及的规则定义在 kaiwu/pkg/sql/opt/norm/rules/*.opt 中。

1.关系代数的 9 种操作

关系代数中包括了:并、交、差、乘、选择、投影、联接、除、自然联接等操作。其中五个基本操作为并(∪)、差(-)、笛卡尔积(×)、投影(π)、选择(σ)。

2.关系代数表达式

由关系代数运算经有限次复合而成的式子称为关系代数表达式,这种表达式的运算结果仍然是一个关系,可以用关系代数表达式表示对数据库的查询和更新操作。

3.关系代数表达式的转换

若两个关系表达式在每一个有效数据实例中都会产生相同的结果集,则可以称他们是等价的(元组的顺利是无关紧要的,而且不能说明任何表达式更优于其他表达式)。

合取选择运算可以分解为单个选择运算,称为选择运算的级联:

选择运算具有交换律:

投影在合理的情况下,只有最后一个有效:

选择操作可与笛卡尔积以及连接相结合:

连接操作满足交换律:

自然连接满足结合律:

4.RBO 转化实例

语句如下:

  • select course_id, title from course;

  • select * from teaches join ① on teaches.course_id = ① .course_id;

  • select * from instructor join ② on Instructor.ID = ② .ID;

  • select name, title from ③ where dept_name = Music and year = 2009;

执行 ④ 语句,转换前的表达式树和转换后的表达式树如下:

在这次转换工程中,使用了谓词下推,结合律,转换后的表达式树一定优于前面的表达式树,这就称为 RBO,基于规则的转换。

5.RBO 基本规则

(1)列裁剪

Select a from t where b >5;

我们可以将 t 表中的所有数据读取上来,然后根据条件过滤,然后再投影,最后拿到列(a)的数据。也可以先进行列剪裁,先把 a,b 数据读取,然后根据过滤条件进行过滤,最后输出数据。

(2)最大最小消除

Select min(ID) from t;

这句话可以转换成 Select id from t order by id desc limit 1;

(3)投影消除

如果一个投影的输入和输出列是一样的,那么这个投影是无用的。

(4)谓词下推

尽量把选择的算子推到叶子节点,这样可以大大减少上面每个表达式节点的消耗。

考虑这样一个句子:Select * from t1,t2 where t1.a > 4 and t2.b >5;

如果先进行笛卡尔积在进行过滤条件时,则会产生很多不必要的元组,但是如果先过滤t1,t2 的关系,在进行笛卡尔积,那么表达式的消耗将大大减少。

在进行过滤时,尽可能精确到一个 select 算子,如若不能,则在具有过滤需要的列及时处理,比如 a.a > 5 and b.b > 10 and a.c > a.b 第一个和第二个条件都可以推到 select 算子中,在这个算子上面立即加一个 a.c > a.b 的过滤条件。

四、规则生成源代码介绍

1.生成代码模块定位,参数解释

入口函数 pkg/sql/opt/optgen/cmd/optgen/main.go 中的 func main(),如图所示:

Kaiwu/Makefile 中调用这个函数,需要输入 5 个参数 os.Args,这些参数依次如下(以探索阶段涉及的 factory.og.go 为例):

  • -out :输出文件标签

  • 输出文件名 :(pkg/sql/opt/xform/factory.og.go)

  • 命令标签 :(compile/explorer/exprs/factory/ops/ rulenames)

  • 结构定义文件 :(pkg/sql/opt/ops/*.opt)

  • 规则源文件 :(pkg/sql/opt/norm/rules/ opt/pkg/sql/opt/xform/rules/.opt)

Makefile 代码定位如下:

2.调试建议

调式某个 opt 文件生成 factory.og.go 文件,如 norm/rules/comp.opt,可以采用如下方式:

3.重要阶段介绍

(1)流程图中重要函数

a. 以 pkg/sql/opt/norm/rules/comp.opt 文件为例进行流程分析:

run(),Parse(),parseOne()函数

进入 Parse()函数——>parseOne():

① Parse()函数对parsed, args赋值;

② parseOne() 函数:裁剪 args a 和 b 参数,剩下 c、d、e;对 FlagSet 结构体中的 actual 赋值;

③ 将生成文件 b 参数赋值给 Flag 中的 Value。

b. g.globResolver(source)函数是将 pkg/sql/opt/ops/*.opt 中的文件 append 到 files 文件中,并将规则文件 pkg/sql/opt/norm/rules/comp.opt 文件加入到 file 中。

c. NewCompiler(files...)函数: 构建 Compiler 结构体,将 files 文件导入:

d. compiler.Compile()→ Parse()→ parseRoot()→ p.scan():

p.scan(): 根据返回值执行不同的操作

① WHITESPACE: 清除空白

② COMMENT: 向 Parser 中的 comment 中添加注释

③ LBRACKET:返回上层函数 parseRoot()

④ parseTags(): 解析出规则名和标准

⑤ parseRule():解析出具体规则

e. compiler.Compile()中的 compileDefines()函数:

将 defines 中的内容赋值给 Compiler→compiled→defineIndex中。

将 define 中的 Tags 赋值给 unique 中。

f. compiler.Compile()→compileRules()→ruleCompiler.compile():

将 pkg/sql/opt/ops/*.opt 文件中定义的元数据和 pkg/sql/opt/norm/rules/camp.opt 中所定义的规则相结合生成新规则,存于 ruleCompiler→compiled→Rules 中。

(2)代码流程图如下

五、总结

以上就是 RBO 的规则转化在数据库中的功能方式,通过规则查询优化器执行一个预设的计划,在此预设规则下,大幅提升执行效率。

优化器-RBO 的规则转化相关推荐

  1. ORACLE优化器RBO与CBO介绍总结

    RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...

  2. oracle cbo rbo参数,Oracle优化器(RBO与CBO)

    在Oracle中80%的性能问题是由SQL语句引起的,而在SQL进行硬解析时会使用Oracle优化器.优化器(Optimizer)是Oracle中内置的一个核心子系统,主要负责成生SQL执行计划.目前 ...

  3. 将oracle优化器改为CBO,【DB.Oracle】Oracle 优化器 (RBO, CBO)

    Oracle优化器 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基于规则 ...

  4. Oracle中的优化器--CBO和RBO

    Oracle中的优化器--CBO和RBO Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的 ...

  5. Oracle执行计划。RBO优化器和CBO优化器。TABLE ACCESS FULL,TABLE ACCESS BY INDEX ROWID,TABLE ACCESS BY INDEX SCAN

    文章目录 通过PL/SQL Developer查看查询的执行计划 1. 什么是执行计划 2. 配置执行计划需要显示的项 3执行计划的常用列字段解释 4. 使用执行计划 5. 查看执行计划 5.1 执行 ...

  6. mysql cbo rbo_Oracle优化器(RBO与CBO)

    Oracle的优化器有两种,基于规则的优化器(RBO)和基于代价的优化器(CBO). 在8i之前,Oracle使用的是RBO(Rule Based Optimizer,基于规则的优化器),他的执行非常 ...

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

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

  8. Spark SQL运行流程及性能优化:RBO和CBO

    1 Spark SQL运行流程 1.1 Spark SQL核心--Catalyst Spark SQL的核心是Catalyst查询编译器,它将用户程序中的SQL/Dataset/DataFrame经过 ...

  9. PLSQL_性能优化系列04_Oracle Optimizer优化器

    2014-09-25 Created By BaoXinjian 一.摘要 1. Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的 ...

最新文章

  1. python基础学习-5(包与模块)
  2. 如何避免GUIDE自动代码的Warning
  3. 【Android】Intent介绍及Intent在Activity中的使用方法
  4. Linux 驱动面试题总结
  5. Tomcat 应用服务器如何设置 Web 服务目录精讲
  6. linux 线程id 进程id,在Linux上显示正在运行的进程的线程ID
  7. 中国1,4-苯醌市场趋势报告、技术动态创新及市场预测
  8. 【转】outlook 2007 如何设置开机自动启动
  9. 人工智能面试题86问,新手找工作必备!
  10. 设计模式 ( 十九) 中介者模式
  11. android进入工程模式,安卓手机怎么进工程模式 安卓手机进工程模式教程【详解】...
  12. python爬虫 | 鸿鹄论坛评论爬取
  13. 设备、设备控制器与驱动程序
  14. 开始起飞-golang编码技巧分享--Dave Cheney博客读后整理
  15. oracle表级附加日志视图,Oracle 附加日志(supplemental log)
  16. 各个排序算法的时间复杂度和稳定性,快排的原理
  17. Win10问题篇:解决鼠标玩游戏单击(左击/右击)失灵问题。
  18. 离谱!以AI数据标注为名,偷拍女性上厕所?
  19. 总是跳转到国内版(cn.bing.com)?New Bing使用全攻略
  20. 【PostgreSQL】数据表的增删改查

热门文章

  1. Sketch设计稿预览快捷工具以及设置方法
  2. 老外为什么会在独立站购物?
  3. 学习Python中turtle模块的基本用法(5:绘制简笔画羊)
  4. 光环国际PMP:项目经理如何回答“这个项目要多久完成?”
  5. 关于spring框架,看这一篇就够了~~~
  6. 【电脑常用办公软件】万彩办公大师教程丨PDF页面分割帮助文档
  7. 我最大渔政船南海首航 宣示中国对南海主权
  8. 我也有简单的广告拦截器.
  9. BPDC1000-DE回馈式电子负载常见问答
  10. mysql怎么限制输入男女_mysql 如何限制字段性别为男女