基于周二的文章《如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1)》(详戳),我们今日继续连载。

目录

  • openGauss数据库SQL引擎

  • openGauss数据库执行器技术

  • openGauss存储技术

  • openGauss事务机制

  • openGauss数据库安全

openGauss数据库SQL引擎

三、查询优化

SQL语句在编写的过程中,数据库应用开发人员通常会考虑以不同的形式来编写SQL,来达到提升执行性能的目的,那么为什么还需要查询优化器来对SQL进行优化呢?这是因为一个应用程序可能会涉及到大量的SQL语句,而且有些SQL语句的逻辑极为复杂,数据库开发人员很难面面俱到的写出高性能语句,而查询优化器则具有一些独特的优势:

§ 查询优化器和数据库应用程序开发人员之间的信息不对称,查询优化器在优化的过程中会参考数据库统计模块自动产生的统计信息,这些统计信息从各个角度来描述数据的分布情况,查询优化器会综合考虑统计信息中的各种数据,从而能够得到一个比较好的执行方案,而数据库用户一方面无法全面的了解数据的分布情况,另一方面也很难通过统计信息构建一个精确的代价模型来对执行计划进行筛选。

§ 查询优化器和数据库应用程序开发人员之间的时效性不同,数据库中的数据瞬息万变,一个在A时间点执行性能很高的执行计划,在B时间点由于数据内容发生了变化,它的性能可能就很低,查询优化器则随时都能根据数据的变化调整执行计划,而数据库应用程序开发人员则只能手动的调整SQL语句,和查询优化器相比,它的时效性比较低;

§ 查询优化器和数据库应用程序开发人员的计算能力不同,目前计算机的计算能力已经大幅提高,在执行数值计算方面和人脑相比具有巨大的优势,查询优化器对一个SQL语句进行优化时,可以从成百上千个执行方案中选择一个最优方案,而人脑要计算这几百种方案需要的时间要远远长于计算机;

因此,查询优化器是提升查询效率的非常重要的一个手段,虽然一些数据库也提供了人工干预执行计划生成的方法,但是通常而言,查询优化器的优化过程对数据库开发人员是透明的,它自动进行逻辑上的等价变换、自动进行物理执行计划的筛选,极大的提高了数据库应用程序开发人员的“生产力”。

依据优化方法的不同,优化器的优化技术可以分为:

§ 基于规则的查询优化(Rule Based Optimization,RBO):根据预定义的启发式规则对SQL语句进行优化。

§ 基于代价的查询优化(Cost Based Optimization,CBO):对SQL语句对应的待选执行路径进行代价估算,从待选路径中选择代价最低的执行路径作为最终的执行计划。

§ 基于机器学习的查询优化(AI Based Optimization,ABO):收集执行计划的特征信息,借助机器学习模型获得经验信息,进而对执行计划进行调优,获得最优的执行计划。

在早期的数据库中,查询优化器通常采用启发式规则进行优化,这种优化方式不不够灵活,往往难以获得最优的执行代价,而基于代价的优化则能够针对大多数场景都高效筛选出性能较好的执行计划,但面对用户千人千面,日趋复杂的实际查询场景,普适性的查询优化由于难以捕捉到用户特定的查询需求、数据分布、硬件性能等特征,难以全方位满足实际的优化需求。

近年来AI技术,特别是在深度学习领域,发展迅速,基于机器学习的优化器在建模效率、估算准确率和自适应性等方面都有很大优势,有望打破RBO和CBO基于静态模型的限制,通过对历史经验的不断学习,将目标场景的模式进行抽象化,形成动态的模型,自适应地针对用户的实际场景进行优化。openGauss采用基于CBO的优化技术,另外在ABO方面也在进行积极探索。

Ⅰ、查询重写

查询重写利用已有语句特征和关系代数运算来生成更高效的等价语句,在数据库优化器中扮演关键角色,尤其在复杂查询中,能够在性能上带来数量级的提升,可谓是“立竿见影”的“黑科技”。本节介绍查询重写的基本概念、常见的查询重写技术、查询重写面临的挑战。

1.  查询重写的概念

SQL语言是丰富多样的,非常的灵活,不同的开发人员依据经验的不同,手写的SQL语句也是各式各样,另外还可以通过工具自动生成。SQL语言是一种描述性语言,数据库的使用者只是描述了想要的结果,而不关心数据的具体获取方式,输入数据库的SQL语言很难做到是以最优形式表示的,往往隐含了一些冗余信息,这些信息可以被挖掘用来生成更加高效的SQL语句。查询重写就是把用户输入的SQL语句转换为更高效的等价SQL,查询重写遵循两个基本原则:

§ 等价性:原语句和重写后的语句,输出结果相同。

§ 高效性:重写后的语句,比原语句在执行时间和资源使用上更高效。

2.  关系代数等价变换

查询重写主要是基于关系代数式的等价变换,关系代数的变换通常满足交换律、结合律、分配率、串接率等,如表2所示。

等价变换

内容

交换律

A × B == B × A

A ⨝B == B ⨝ A

A ⨝F B == B ⨝F A -- F是连接条件

Π p(σF (B)) == σF (Π p(B)) –- F∈p

结合律

(A × B) × C==A × (B × C)

(A ⨝ B) ⨝ C==A ⨝ (B ⨝ C)

(A ⨝F1 B) ⨝F2 C==A ⨝F1 (B ⨝F2 C) -- F1和F2是连接条件

分配律

σF(A × B) == σF(A) × B -- F ∈ A

σF(A × B) == σF1(A) × σF2(B) -- F = F1 ∪ F2,F1∈A, F2 ∈B

σF(A × B) == σFX (σF1(A) × σF2(B)) -- F = F1∪F2∪FX,F1∈A, F2 ∈B

Π p,q(A × B) == Π p(A) × Π q(B) -- p∈A,q∈B

σF(A × B) == σF1(A) × σF2(B) -- F = F1 ∪ F2,F1∈A, F2 ∈B

σF(A × B) == σFx (σF1(A) × σF2(B)) -- 其中F = F1∪F2∪Fx,F1∈A, F2 ∈B

串接律

Π P=p1,p2,…pn(Π Q=q1,q2,…qn(A)) == Π P=p1,p2,…pn(A) -- P ⊆ Q

σF1(σF2(A)) == σF1∧F2(A)

表2  关系代数等价变换

表2中的等价变换规则并不能把所有的情况都列举出来,例如,如果对σF1(σF2(A)) == σF1∧F2(A)继续推导,那么就可以获得:

σF1(σF2(A)) == σF1∧F2(A) == σF2∧F1(A) == σF2(σF1(A))

因此,在熟悉了关系代数的操作之后,就可以灵活的利用关系代数的等价关系进行推导,获得更多的等价式。这些等价的变换一方面可以用来根据启发式的规则做优化,这样能保证等价转换之后的关系代数表达式的执行效率能够获得提高而非降低,例如借助分配率可以将一个选择操作下推,这样能降低上层结点的计算量,另一方面还可以用来生成候选的执行计划,候选的执行计划再由优化器根据估算的代价进行筛选。

3.  常见的查询重写技术

介绍下openGauss几个关键的查询重写技术:常量表达式化简、子查询优化、选择下推和等价推理等。

1)常量表达式化简

常量表达式即用户输入SQL语句中包含运算结果为常量的表达式,分为算数表达式、逻辑运算表达式、函数表达式,查询重写可以对常量表达式预先计算以提升效率。例如:

示例1:该语句为典型的算数表达式查询重写,经过重写之后,避免了在执行时每条数据都需要进行1+1运算。

SELECT * FROM t1 WHERE c1=1+1;

【连载】如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2)相关推荐

  1. openGauss数据库源码解析系列文章—— SQL引擎源解析(一)

    本篇我们开启"SQL引擎源解析"中"6.1 概述"及"6.2 SQL解析"的精彩内容介绍. 第6章 SQL引擎源解析 SQL引擎作为数据库系 ...

  2. openGauss数据库源码解析系列文章——SQL引擎源码解析(一)

    SQL引擎作为数据库系统的入口 , 主要承担了对SQL语言进行解析 . 优化 . 生成执行计划的 作用.对于用户输入的SQL语句,SQL引擎会对语句进行语法/ 语义上的分析以 判断是否满足语法规则等, ...

  3. 【连载】如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(4)

    前文回顾: 如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1) 如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2) 如何掌握openGauss数据库核心技术?秘 ...

  4. 【连载】如何掌握openGauss数据库核心技术?秘诀五:拿捏数据库安全(4)

    点击蓝字 · 关注我们 前文回顾: 1.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1) 2.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2) 3.如何掌握 ...

  5. 【连载】如何掌握openGauss数据库核心技术?秘诀五:拿捏数据库安全(3)

    点击蓝字 · 关注我们 前文回顾: 1.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1) 2.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2) 3.如何掌握 ...

  6. 【连载】如何掌握openGauss数据库核心技术?秘诀五:拿捏数据库安全(2)

    点击蓝字 · 关注我们 前文回顾: 1.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1) 2.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2) 3.如何掌握 ...

  7. 【连载】如何掌握openGauss数据库核心技术?秘诀五:拿捏数据库安全(1)

    点击蓝字 关注我们 前文回顾: 1.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1) 2.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2) 3.如何掌握op ...

  8. 【连载】如何掌握openGauss数据库核心技术?秘诀四:拿捏事务机制(4)

    前文回顾: 1.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1) 2.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2) 3.如何掌握openGauss数据库 ...

  9. 【连载】如何掌握openGauss数据库核心技术?秘诀四:拿捏事务机制(3)

    前文回顾: 1.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1) 2.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2) 3.如何掌握openGauss数据库 ...

最新文章

  1. Solaris的md5sum和sha1sum命令
  2. java 抽象工厂 类图_spring学习中常用到的工厂,抽象工厂学习 | 学步园
  3. appium---【Mac】Appium-Doctor提示WARN:“ opencv4nodejs cannot be found”解决方案
  4. java十六进制大小端转换_字节顺序
  5. 数据库(5)SQL约束
  6. java中数据结构_JAVA中数据结构总结
  7. 安卓案例:利用帧动画实现游戏特效
  8. mozilla开源项目学习----智能指针(AutoPtrAutoArrayPtr)(上)
  9. 三维软件Skyline开发初步
  10. Beyond Compare代码对比工具国内镜像下载
  11. 分布式开源调度框架TBSchedule详解
  12. 计算机管理格式化硬盘,如何将电脑硬盘格式化?笔记本硬盘格式化的操作方法...
  13. UOJ #141. 【UER #4】量子态的棋盘
  14. 【前端程序员的中秋节】中秋节,送你千盏孔明灯,万家灯火故事长
  15. 【100个 Unity实用技能】| 关于触发器互相检测的必要前提条件配置
  16. One-Stage Visual Grounding之一种快速准确的单阶段视觉定位
  17. 一篇长文带你深析Linux动态链接的全过程
  18. openssl RSA 内存读取密钥
  19. 苹果原生二维码扫描器
  20. Ubuntu17.04 安装搜狗中文输入法

热门文章

  1. Java 并发(JUC 包-03)
  2. 美剧 《圣经故事》 故事线
  3. eclipse theia_Eclipse的Theia发布,缺少KubeCon,还有更多行业趋势
  4. 开启你的开源项目生涯_了解如何在5分钟内以开源方式开始您的职业生涯
  5. unix 系统已经消亡了吗_世界上一半的语言正在消亡。 我们应该保存它们吗?
  6. opensource项目_Opensource.com下一次迭代的重点
  7. 第二十二章:洗净皮衣
  8. addEventListener方法与on事件的区别
  9. Bootstrap3 模态对话框的调用方式
  10. Bootstrap 标签导航的布局