深度解读 Cascades 查询优化器

数据库中查询优化器是数据库的核心组件,其决定着 SQL 查询的性能。Cascades 优化器是 Goetz 在 volcano optimizer generator 的基础上优化之后诞生的一个搜索框架。

本期技术贴将带大家了解 Cascades 查询优化器。首先介绍 SQL 查询优化器,接着分析查询优化基本原理,最后对 Cascades 查询优化器进行重点介绍。

一、SQL 查询优化器

用户与数据库交互时只需要输入声明式 SQL 语句,数据库优化器则负责将用户输入的 SQL 语句进行各种规则优化,生成最优的执行计划,并交由执行器执行。优化器对于 SQL 查询具有十分重要的意义。

如图 1 所示,SQL 语句经过语法和词法解析生成抽象语法树(AST),经过基于规则的查询优化(Rule-Based Optimizer)基于代价的查询优化(Cost-Based Optimizer)生成可执行计划。

图 1

  • 基于规则的优化算法: 基于规则的优化方法的要点在于结构匹配和替换。应用规则的算法一般需要先在关系代数结构上匹配一部分局部的结构,再根据结构的特点进行变换乃至替换操作。

  • 基于成本的优化算法: 现阶段主流的方法都是基于成本(Cost)估算的方法。给定某一关系代数代表的执行方案,对这一方案的执行成本进行估算,最终选择估算成本最低的方案。尽管被称为基于成本的方法,这类算法仍然往往要结合规则进行方案的探索。基于成本的方法其实是通过不断的应用规则进行变换得到新的执行方案,然后对比方案的成本优劣进行最终选择。

二、查询优化的基本原理

优化器一般由三个组件组成:统计信息收集开销模型计划列举

如图 2 所示,开销模型使用收集到的统计信息以及构造的不同开销公式,估计某个特定查询计划的成本,帮助优化器从众多备选方案中找到开销最低的计划。

图 2

SQL 语句查询优化基于关系代数这一模型:

  • SQL 查询可以转化为关系代数;

  • 关系代数可以进行局部的等价变换,变换前后返回的结果不变但是执行成本不同;

  • 通过寻找执行成本最低的关系代数表示,我们就可以将一个 SQL 查询优化成更为高效的方案。

寻找执行成本最低的关系代数表示,可以分为基于动态规划的自底向上基于 Cascades/Volcano 的自顶向下两个流派。

  • 自底向上搜索:从叶子节点开始计算最低成本,并利用已经计算好的子树成本计算出母树的成本,就可以得到最优方案;

  • 自顶向下搜索:先从关系算子树的顶层开始,以深度优先的方式来向下遍历,遍历过程中进行剪枝。

自底向上的优化器从零开始构建最优计划,这类方法通常采用动态规划策略进行优化,采用这类方法的优化器包括 IBMSystem R。自顶向下的优化策略的优化器包括基于 Volcano 和 Cascades 框架的优化器。

三、Cascades 查询优化器

Cascades 查询优化器采用自顶向下的搜索策略,并在搜索过程中利用 Memo 结构保存搜索的状态。

Cascades 关键组件构成:

  • Expression:Expression 表示一个逻辑算子或物理算子。如 Scan、Join 算子;

  • Group:表示等价 Expression 的集合,即同一个 Group 中的 Expression 在逻辑上等价。Expression 的每个子节点都是以一个 Group 表示的。一个逻辑算子可能对应多个物理算子,例如一个逻辑算子 Join(a,b),它对应的物理算子包括{HJ(a, b), HJ(b, a), MJ(a, b), MJ(b, a), NLJ(a, b), NLJ(b, a)}。我们将这些逻辑上等价的物理算子称为一个 Group(组)。注:HJ 表示 HashJoin 算子,MJ 表示 MergeJoin 算子,NLJ 表示 NestLoopJoin 算子;

  • Memo:由于 Cascades 框架采用自顶向下的方式进行枚举,因此,枚举过程中可能产生大量的重复计划。为了防止出现重复枚举,Cascades 框架采用 Memo 数据结构。Memo 采用一个类似树状(实际是一个图状)的数据结构,它的每个节点对应一个组,每个组的成员通过链表组织起来;

  • Transformation Rule:是作用于 Expression 和 Group 上的等价变化规则,用来扩大优化器搜索空间。

Cascades 首先将整个 Operator Tree 按节点拷贝到一个 Memo 的数据结构中,Memo 由一系列的 Group 构成,每个算子放在一个 Group,对于有子节点的算子来说,将原本对算子的直接引用,变成对 Group 的引用。

图 3

如图 3 所示,生成该语法树的 Memo 初始结构。Memo 结构中一个圆角框代表一个算子,圆角框右下角是对其 Children’s Groups 的引用,左下角是唯一标识符。生成初始的 Memo 结构后,可以采用 transform rule 进行逻辑等价转换,规则如下:

  • 对于一个逻辑算子,其所有基于关系代数的等价表达式保存在同一个 Group 内,例如 join(A,B) -> join(B,A);

  • 在一个 Group 内,对于一个逻辑算子,会生成一个或多个物理算子,例如 join -> hash join,merge join,NestLoop join;

  • 一个 Group 内,一个算子,其输入(也可以理解为subplan)可以来自多个 Group 的表达式。

在图 4 中,描述了一个部分扩展的 Memo 结构,与图 1 中的初始 Memo 相比,在同一个 Group 内,增加了等价的逻辑算子,以及对应的物理算子。

图 4

在探索的过程中,优化器就会通过开销模型 Coster 借助统计信息来计算子步骤的开销,遍历完每个 Memo Group之后,归总得到每个完整计划的总开销,最终选择 Memo 中开销最低的计划。

图 5

图 5 中有三个 Group,分别对应三个逻辑算子:Join(a, b), GET(a) 和 GET(b)。Group 1(Group 2)中包含了所有对应 GET(a) (GET(b))的物理算子,我们可以估算每个物理算子的代价,选取其中最优的算子保留下来。

为了防止枚举过程出现重复枚举某个表达式,Memo 结构体中还包含一个哈希表(exprHT),它以表达式为哈希表的键,用来快速查找某个表达式是否已经存在于 Memo 结构体中。

Cascades 采用自顶向下的方式来进行优化,以计划树的根节点为输入,递归地优化每个节点或表达式组。如图所示,整个优化过程从 Group 0 开始,实际上要先递归地完成两个子节点(Group 1 和 Group 2)的优化。

因此,实际的优化完成次序是 Group 1 -> Group2 -> Group 0。在优化每个 Group 时,依次优化每个组员;在优化每个组员时,依次递归地优化每个子节点。依次估算当前组里每个表达式 e 的代价 cost(e),选择最低得代价结果保存在 bestHT 中。优化结束时,查询 Join(a,b)对应的 Memo 结构体,获取最低的执行计划。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/217591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 7 源码部署 Nginx

文章目录 1. 概述2. 部署示例2.1 下载和解压 Nginx 源码2.2 安装编译依赖包2.3 编译和安装2.4 启动 Nginx2.5 配置防火墙2.6 设置 Nginx 为系统服务2.7 配置访问 3. 扩展知识 1. 概述 Nginx 是一款高性能的开源 Web 服务器软件,广泛应用于互联网领域。本篇博客将介…

【日积月累】Spring中的AOP与IOC相关问题详解

Spring中的AOP与IOC 1.前言2.Spring AOP(面向切面编程)2.1 AOP的实现过程2.2 AOP代理模式的类型2.2.1JDK的动态代理2.2.2CGLIB的动态代理 2.3AOP应用常见场景2.3.1日志记录 2.4对AOP的理解 3.Spring IOC(Inversion of Control,控…

29、Windows安全配置

文章目录 一、Windows安全配置简介二、账户策略2.1 密码策略2.2 账户锁定策略 三、本地策略3.1 用户权限分配 四、安全设置4.1 账户4.2 审核4.3 设备4.4交互式登录4.5 网络访问4.6 网络安全4.7 用户账户控制4.8 防火墙配置 五、高级审核策略设置5.1 账户登录5.2 账户管理5.3 对…

架构设计系列之基础:基础理论(一)

在软件开发和软件架构领域,深厚的理论基础是构建高质量、可维护、可扩展系统的关键,本部分内容将围绕这些基础理论展开。(本部分内容介绍第一部分:编程三范式、架构设计原则、软件设计七原则) 一、编程三范式 编程范…

112. 路径总和(Java)

目录 解法: 官方解法: 方法一:广度优先搜索 思路及算法 复杂度分析 时间复杂度: 空间复杂度: 方法二:递归 思路及算法 复杂度分析 时间复杂度: 空间复杂度: 给你二叉树的…

(C++)最大连续1的个数--滑动窗口

个人主页:Lei宝啊 愿所有美好如期而遇 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://le…

MIT18.06线性代数 笔记2

文章目录 正交向量与子空间子空间投影投影矩阵和最小二乘正交矩阵和Gram-Schmidt正交化行列式及其性质行列式公式和代数余子式克拉默法则、逆矩阵、体积特征值和特征向量对角化和A的幂微分方程和exp(At)马尔科夫矩阵 傅里叶级数复习二 正交向量与子空间 向量正交:x…

【初阶C++】前言

C前言 1. 什么是C2. C发展史3. C的重要性4. 如何学习C 1. 什么是C C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, …

【Linux系统编程二十一】:(进程通信3)--消息队列/信号量(system v标准的内核数据结构的设计模式)

【Linux系统编程二十】:消息队列/信号量(system v标准的内核数据结构的设计模式) 一.消息队列二.system v标准的内核数据结构的设计三.四个概念(互斥/临界)四.信号量1.多线程并发访问2.计数器3.原子的4.总结 一.消息队列 一个叫做a进程啊,一个…

如何将LLMs封装成应用并在本地运行

最近我一直在致力于Ollama的工作,因此我花了很多时间思考如何在本地系统上运行大型语言模型(LLMs)以及如何将它们打包成应用程序。对于使用LLMs的大多数桌面应用程序而言,通常的体验要么是插入OpenAI API密钥,要么是从…

protobuf基础学习

部分内容出自:https://blog.csdn.net/baidu_32237719/article/details/99723353 proto文件来预先定义的消息格式。数据包是按照proto文件所定义的消息格式完成二进制码流的编码和解码。proto文件,简单地说,就是一个消息的协议文件&#xff0c…

MAC IDEA Maven Springboot

在mac中,使用idea进行maven项目构建 环境配置如何运行maven项目1.直接在IDEA中运行2.使用jar打包后执行 如何搭建spring boot1.添加依赖2.创建入口类3.创建控制器4. 运行5.其他 环境配置 官网安装IDEA使用IDEA的创建新项目选择创建MAEVEN项目测试IDEA的MAVEN路径是…

【二分查找】【双指针】LeetCode:2565最少得分子序列

作者推荐 【动态规划】【广度优先】LeetCode2258:逃离火灾 本文涉及的基础知识点 二分查找算法合集 有序向量的二分查找,初始化完成后,向量不会修改。 双指针: 用于计算子字符串是s的字符串的子系列。 题目 给你两个字符串 s 和 t 。 你…

《地理信息系统原理》笔记/期末复习资料(10. 空间数据挖掘与空间决策支持系统)

目录 10. 空间数据挖掘与空间决策支持系统 10.1. 空间数据挖掘 10.1.1. 空间数据挖掘的概念 10.1.2. 空间数据挖掘的方法与过程 10.1.3. 空间数据挖掘的应用 10.2. 空间决策支持系统 10.2.1. 空间决策支持系统的概念 10.2.2. 空间决策支持系统的结构 10.2.3. 空间决策…

基于chaos混沌的彩色图像加解密系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 混沌理论简介 4.2 基于混沌的图像加密原理 4.3 数学公式与实现过程 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................…

记录将C语言编写的Windows程序转换为python语言编写,演示具体效果在最后,这对初学者理解Windows消息机制及框架有一定参考作用

主要思路 由于C语言的数组定义使用名字加中括号及括号内数字定义,但是在python中【】已经被作为列表 元组等序列类型分片、存取元素,因此我们不能像C语言那样定义数组 例如C语言 int a[10] 是声明定义一个含有10个int类型的数组a,而在执行语句部分…

华为OD机试真题B卷 Java 实现【统计大写字母个数】,附详细解题思路

一、题目描述 找出给定字符串中大写字符(即’A’-‘Z’)的个数。 数据范围:字符串长度:1≤∣s∣≤250 字符串中可能包含空格或其他字符 二、输入描述 对于每组样例,输入一行,代表待统计的字符串。 三、输出描述 输出一个整…

【css】css实现文字两端对齐效果:

文章目录 一、方法1:二、方法2:三、注意: 一、方法1: 给元素设置 text-align: justify;text-align-last: justify;并且加上text-justify: distribute-all-line; 目的是兼容ie浏览器 p{width: 130px;text-align: justify;text-alig…

飞天使-linux操作的一些技巧与知识点3-http的工作原理

文章目录 http工作原理nginx的正向代理和反向代理的区别一个小技巧dig 命令巧用 http工作原理 http1.0 协议 使用的是短连接,建立一次tcp连接,发起一次http的请求,结束,tcp断开 http1.1 协议使用的是长连接,建立一次tc…

Network 灰鸽宝典【目录】

目前已有文章 21 篇 Network 灰鸽宝典专栏主要关注服务器的配置,前后端开发环境的配置,编辑器的配置,网络服务的配置,网络命令的应用与配置,windows常见问题的解决等。 文章目录 服务配置环境部署GitNPM 浏览器编辑器系…