查询优化器:RBO与CBO

SQL查询优化器

    • 1、数据库系统发展简史
    • 2、SQL查询优化器
    • 3、查询优化器分类
    • 4、查询优化器执行过程
    • 5、CBO框架Calcite简介


1、数据库系统发展简史


数据库系统诞生于20世纪60年代中期,至今已有近50多年的历史,其发展经历了三代演变,造就了四位图灵奖得主,并发展成为一门计算机基础学科,带动了一个巨大的软件产业

在这里插入图片描述

20世纪60年代后期出现了一种新型数据库软件:决策支持系统(Decision Support System,DSS),其目的是让管理者在决策过程中更有效地利用数据信息

决策支持系统是辅助决策者通过数据、模型和知识,以人机交互方式进行半结构化或非结构化决策的计算机应用系统。它是管理信息系统向更高一级发展而产生的先进信息管理系统

1988年,为解决企业集成问题,爱尔兰公司的Barry Devlin和Paul Murphy创造性的提出了一个新的概念:信息仓库(InformationWarehouse)

1991年,Bill Inmon出版了一本如何构建数据仓库(DataWarehouse)的书,使得数据仓库真正开始应用,Bill Inmon凭借这本书奠定了其在数据仓库建设的位置,被称之为“数据仓库之父”

数据仓库是决策支持系统和联机分析应用数据源的结构化数据环境,是一个面向主题的(SubjectOriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(TimeVariant)的数据集合,用于支持管理决策(DecisionMaking Support)

数据库系统是操作系统之上最重要的基础设施之一,被称为软件产业的常青树,特别是它所支撑起来的大数据、人工智能应用,更是发展迅猛

随着数据库领域的快速发展以及数据量的爆发式增长,如何对海量数据进行管理、分析、挖掘变得尤为重要。SQL优化器正是在这种背景下诞生的

2、SQL查询优化器


查询优化器是传统数据库的核心模块,也是大数据计算引擎的核心模块,开源大数据引擎如Impala、Presto、Drill、Spark、Hive等都有自己的查询优化器

数据库系统主要由三部分组成:解析器、优化器和执行引擎

在这里插入图片描述

其中优化器是数据库中用于把关系表达式转换成执行计划的核心组件,很大程度上决定了一个系统的性能。特别是对于现代大数据系统,执行计划的搜索空间异常庞大,研究人员研究了许多方法对执行计划空间进行裁剪,以减少搜索空间的代价

在当今数据库系统领域,查询优化器可以说是必备组件,不管是关系型数据库系统Oracle、MySQL,流处理领域的Flink、Storm,批处理领域的Hive、SparKSQL,还是文本搜索领域的Elasticsearch等,都会内嵌一个查询优化器

有的数据库系统会采用自研的优化器,而有的则会采用开源的查询优化器框架,例如Oracle数据库的查询优化器,则是Oracle公司自研的一个核心组件,负责解析SQL,其目的是按照一定的原则来获取目标SQL在当前情形下执行的最高效执行路径

而Apache Calcite是一个独立于存储与执行的SQL优化引擎,广泛应用于开源大数据计算引擎中,如Hive、Flink、Kylin等,另外,MaxCompute也使用了Calcite作为优化器框架

关于查询优化器所要解决的核心问题:具有多个连接操作的复杂查询优化。不少学者相继提出了基于左线性树的查询优化算法、基于右线性树的查询优化算法、基于片段式右线性树的查询优化算法、基于浓密树的查询优化算法、基于操作森林的查询优化算法等。这些算法在搜索代价和最终获得的查询计划的效率之间有着不同的权衡

总的来说,查询优化器在很大程度上决定了一个数据库系统的性能,优化器的作用就好比找到两点之间的最短路径

3、查询优化器分类


查询优化器分为两类:基于规则的优化器(Rule-Based Optimizer,RBO)和基于代价的优化器(Cost-Based Optimizer,CBO)

  • RBO

    RBO即基于规则的优化器,该优化器按照硬编码在数据库中的一系列规则来决定SQL的执行计划。以Oracle数据库为例,RBO根据Oracle指定的优先顺序规则,对指定的表进行执行计划的选择。比如在规则中:索引的优先级大于全表扫描

    通过Oracle的这个例子我们可以感受到,在RBO中,有着一套严格的使用规则,只要你按照规则去写SQL语句,无论数据表中的内容怎样,也不会影响到你的“执行计划”,也就是说RBO对数据不“敏感”。这就要求开发人员非常了解RBO的各项细则,不熟悉规则的开发人员写出来的SQL性能可能非常差

    但在实际的过程中,数据的量级会严重影响同样SQL的性能,这也是RBO的缺陷所在。毕竟规则是死的,数据是变化的,所以RBO生成的执行计划往往是不可靠的,不是最优的

  • CBO

    CBO即基于代价的优化器,该优化器通过根据优化规则对关系表达式进行转换,生成多个执行计划,然后CBO会通过根据统计信息(Statistics)和代价模型(Cost Model)计算各种可能“执行计划”的代价(COST),并从中选用COST最低的执行方案,作为实际运行方案

    CBO依赖数据库对象的统计信息,统计信息的准确与否会影响CBO做出最优的选择。以Oracle数据库为例,统计信息包括SQL执行路径的I/O、网络资源、CPU的使用情况

    目前各大数据库和大数据计算引擎都倾向于使用CBO,例如从Oracle 10开始,Oracle已经彻底放弃RBO,转而使用CBO;而Hive从0.14.0版本开始也引入了CBO

以下是一个例子:

众所周知,join是非常耗时的一个操作,且性能与join双方数据量大小呈线性关系(通常情况下)。那么很自然的一个优化,就是尽可能减少join双方的数据量,于是就想到了先filter再join这样一个Rule。而非常多个类似的Rule,就构成了RBO

但后面开发者发现,RBO确实能够在通用情况下对SQL进行优化,但在有些需要本地状态才能优化的场景却无能为力。比如某个计算引擎,在数据量较小的时候,可以做一些特殊的优化操作,这种场景下RBO无能为力

此时,CBO就成为首选。例如Spark的join:在Spark中,join会触发Shuffle操作,这是非常消耗资源的。而Spark有三种类型的join:

  • Broadcast Hash Join:将小的表广播到所有节点,在内存中hash碰撞进行join,这种join避免节点间Shuffle操作,性能最好,但条件也苛刻
  • Hash Join:即普通的Shuffle Join
  • Sort Merge Join:先排序然后join,类似归并的思想,排序后能减少一些hash碰撞后的数据扫描,在join双方都是大表的情况下性能较好

选择哪种类型的join,就要根据数据来选择,如果一方是小表,就用Broadcast Hash Join,如果双方都是大表,就用Sort Merge Join,否则就用Hash Join。而这就需要用到CBO

4、查询优化器执行过程


无论是RBO,还是CBO都包含了一系列优化规则,这些优化规则可以对关系表达式进行等价转换,常见的优化规则包括:谓词下推、列裁剪、常量折叠等

在这些优化规则的基础上,就能对关系表达式做相应的等价转换,从而生成执行计划

1)RBO

  • Transformation:遍历关系表达式,只要模式能够满足特定优化规则就进行转换,生成了一个逻辑执行计划(仅逻辑上可行)
  • Build Physical Plan:将逻辑执行计划Build成物理执行计划,即决定各个Operator的具体实现。如join算子的具体实现选择Broadcast Hash Join还是Sort Merge Join

2)CBO

  • Exploration:根据优化规则进行等价转换,生成多个等价关系表达式,此时原有关系表达式会被保留
  • Build Physical Plan:根据CBO实现的两种模型Volcano模型(先Explore后Build)和Cascades模型(边Explore边Build)决定各个Operator的具体实现
  • Find Best Plan:根据统计信息计算各个执行计划的Cost,选择Cost最小的执行计划执行

RBO与CBO的区别在于,RBO只会应用提供的Rule,而CBO会根据Cost智能应用Rule,求出一个最低Cost的执行计划,CBO也是基于Rule的

5、CBO框架Calcite简介


1)Calcite的产生背景

在上世纪,关系型数据库系统基本主导了数据处理领域,但是在Google三篇创世纪论文发表后,大家开始意识到,一种适合所有场景的数据库是不存在的

事实上,今天也确实是这样,许多特定场景下的数据处理系统已经成为主流,例如流处理领域的Flink、Storm,批处理领域的Hive、SparkSQL,文本搜索领域的Elasticsearch等

而在开发不同特定场景的数据处理系统的时候,主要存在两个问题:

  • 每种系统都需要查询语言(SQL)及相关拓展(如流式SQL查询),或是开发过程中碰到查询优化问题,没有一个统一框架,每个系统都要一套自己的查询解析框架,重复造轮子
  • 开发的这些系统通常要对接或集成其他系统,比如Kylin集成MR,Spark,Hbase等,如何支持跨异构数据源成为一大问题

因此,Calcite应运而生

Calcite官网:https://calcite.apache.org/

2)Calcite中的优化器

在这里插入图片描述

Calcite中的优化器详解参考文章:https://matt33.com/2019/03/17/apache-calcite-planner/


参考文章:

https://zhuanlan.zhihu.com/p/40478975

https://www.cnblogs.com/mzq123/p/10398701.html

https://www.cnblogs.com/JasonCeng/p/14199298.html

https://www.cnblogs.com/listenfwind/p/13192259.html


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

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

相关文章

如何更改IP地址为美国IP?美国静态住宅代理如何搭建?

相信很多做跨境电商或外贸如TikTok shop、Facebook商店、Amazon、领英的玩家都需要搭建独享的美国IP环境来运营店铺,那么如何搭建稳定独享的IP环境呢?加下来为你详细介绍,助力您的跨境业务。 一、选择合适的代理IP 代理IP可以帮助隐藏用户真…

RT-Thread 11. Scons 选择不同的编译器编译BSP

1.使用gcc编译工程,生成elf、bin文件 如果是 ARM 平台的芯片,则可以使用 Env 工具,输入 scons 命令直接编译 BSP,这时候默认使用的是 ARM GCC 编译器,因为 Env 工具带有 ARM GCC 编译器。 2.使用template.uvproj 生成…

Java 萌新入门 -- 一些常见的基础知识点

文章目录 前言第一章.java语言概述java语言基础1.程序文档风格和注释2.从键盘读取数据3.变量与赋值4.java标识符5.关于数据类型与逻辑运算符6.限制输出 小数位数:(用第三种)7.关于带标签的的循环控制语句 第二章.类和对象与数组的定义1.方法设…

搭建嵌入式GDB调试环境以及VSCode+gdbserver 图形化调试

目录 1 搭建嵌入式gdb调试环境 1.1 交叉编译工具链自带的gdb和gdbserver 1.2 使用gdb进行嵌入式程序调试 1.2.1编写简单测试程序 1.2.2 gdb调试程序 1.3 源码编译gdb和gdbserver 1.3.1 下载gdb和gdbserver源码 1.3.2 编译gdb 1.3.3 移植gdbserver 2 VSCodegdbserver 图…

单片机程序无法下载?

原因一:电源问题 电源可能是导致STM32微控制器无法下载程序的一个常见原因。确保电源稳定对于正常运行和下载程序至关重要。以下是一些电源问题: 1. 电源电压不足:如果STM32微控制器没有足够的电压供应,它可能无法正常工作或下载程…

22款奔驰GLS450升级中规主机 实现导航地图 中文您好奔驰

很多平行进口的奔驰GLS都有这么一个问题,原车的地图在国内定位不了,语音交互功能也识别不了中文,原厂记录仪也减少了,使用起来也是很不方便的。星骏汇小许 Xjh15863 其实很简单,我们只需要更换一台中规的新主机就可以实…

【数据结构】树与二叉树(六):二叉树的链式存储

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉…

『MySQL快速上手』-⑤-数据类型

文章目录 1.数据类型有哪些2.数值类型2.1 tinyint 类型2.2 bit 类型2.3 小数类型2.3.1 float2.3.2 decimal 3.字符串类型3.1 char3.2 varchar3.2 char 和 varchar 比较 4.日期和时间类型5.enum和set 1.数据类型有哪些 MySQL支持多种数据类型,这些数据类型可用于定义…

【AntDesign】Docker部署

docker部署是主流的部署方式,极大的方便了开发部署环境,保持了环境的统一,也是实现自动化部署的前提。 1 项目的目录结构 dist: 使用build打包命令,生成的打包目录 npm run build : 打包项目命令 docker: 存放docker容器需要修改…

Python爬虫-获取汽车之家车家号

前言 本文是该专栏的第9篇,后面会持续分享python爬虫案例干货,记得关注。 地址:aHR0cHM6Ly9jaGVqaWFoYW8uYXV0b2hvbWUuY29tLmNuL0F1dGhvcnMjcHZhcmVhaWQ9MjgwODEwNA== 需求:获取汽车之家车家号数据 笔者将在正文中介绍详细的思路以及采集方法,废话不多说,跟着笔者直接往…

MCU系统的调试技巧

MCU系统的调试技巧对于确保系统稳定性和性能至关重要。无论是在嵌入式系统开发的初期阶段还是在产品维护和优化的过程中,有效的调试技巧可以帮助开发人员快速发现和解决问题,本文将讨论一些MCU系统调试的技巧。 首先,使用调试工具是非常重要…

[量化投资-学习笔记008]Python+TDengine从零开始搭建量化分析平台-CCI和ATR

目录 1. 指标简介CCIATR 2. 程序编写题外话 1. 指标简介 将这两个指标放在一起,一方面是因为这两个指标都属于摆动指数,可以反应市场的活跃度。 另一方面是因为CCI和ATR与之前提到的EMA,MACD,布林带的三个指标的计算基础不同。之前的三个指标都是以收盘…

AR眼镜硬件解决方案_AR/VR智能眼镜安卓主板芯片方案介绍

随着近两年来增强现实(AR)技术的逐渐成熟,采用MT8788芯片解决方案的AR眼镜已经问世。众所周知,AR技术可以帮助开发者打造一个既强大而又实用的混合现实世界,将虚拟与真实世界相结合。 据了解,MT8788芯片采用了多芯片分布式处理系统…

虚幻5.3打包Windows失败

缺失UnrealGame二进制文件。 必须使用集成开发环境编译该UE项目。或者借助虚幻编译工具使用命令行命令进行编译 解决办法: 1.依次点击平台-项目启动程序 2.点击后面的按钮进行设置 3.稍等后,打包后的程序即可运行,之后就可以愉快的打包了

支持向量机 (SVM):初学者指南

照片由 Unsplash上的 vackground.com提供 一、说明 SVM(支持向量机)简单而优雅用于分类和回归的监督机器学习方法。该算法试图找到一个超平面,将数据分为不同的类,并具有尽可能最大的边距。本篇我们将介绍如果最大边距不存在的时候…

Android修行手册-实现利用POI将图片插入到Excel中(文末送书)

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…

ZZ308 物联网应用与服务赛题第G套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 (G卷) 赛位号:______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等; 2.竞赛任务中所使用…

lsky Pci-go nas个人图床搭建

①安装PicGo 应用 http://192.168.50.249:18189/api/v1 上传电脑需要有node 和 npm环境,官网下载最新安装板node后,自动会配置npm环境。 ②安装 Lsky-Uploader 获取token: http://www.metools.info/code/post278.html 服务器域名为 Lsky p…

UICollectionView左上对齐布局

最近完成的项目需要左上对齐的瀑布流,每个格子的尺寸不同,可以使用UICollectionView定义不同的尺寸,但是CollectionView的格子高度是相同的,我想要的是这样 左上对齐分别是0、1、2;3、4; 当前只能自定义一个…

OpenCV 输出文本

PutText() 输出文本 OpenCV5 将支持中文字符的输出, 当前版本OpenCV4原生不支持, 可以使用Contrib包FreeType方式实现, 不过比较麻烦.为了省事, 也可以通过将Mat转成bitmap,然后使用GDI方式输出中文字符. 示例代码 /// <summary>/// OpenCV暂时不能支持中文字符输出,显示…