广告
返回顶部
首页 > 资讯 > 数据库 >openGauss SQL引擎 (上)
  • 905
分享到

openGauss SQL引擎 (上)

openGaussSQL引擎(上) 2015-03-19 14:03:08 905人浏览 绘本
摘要

openGauss SQL引擎 (上)

数据库sql引擎是数据库重要的子系统之一,它对上负责承接应用程序发送的SQL语句,对下负责指挥执行器运行执行计划。其中优化器作为SQL引擎中最重要、最复杂的模块,被称为数据库的“大脑”,优化器产生的执行计划的优劣直接决定数据库的性能。

本文从SQL语句开始介绍,对SQL引擎的各个模块进行全面的说明。

一、 SQL引擎概览

SQL引擎是数据库系统的重要组成部分,主要职责是将应用程序输入的SQL语句在当前负载场景下生成高效的执行计划,在SQL语句的高效执行上扮演重要角色。

SQL语句在SQL引擎中的执行过程如下图所示。

在这里插入图片描述

图 SQL语句在SQL引擎中的执行流程

从上图中可以看出,应用程序的SQL语句需要经过SQL解析生成逻辑执行计划、经过查询优化生成物理执行计划,然后将物理执行计划转交给查询执行引擎做物理算子的执行操作。

SQL解析通常包含词法分析、语法分析、语义分析几个子模块。SQL是介于关系演算和关系代数之间的一种描述性语言,它吸取了关系代数中一部分逻辑算子的描述,而放弃了关系代数中“过程化”的部分,SQL解析主要的作用就是将一个SQL语句编译成为一个由关系算子组成的逻辑执行计划。

描述语言的特点是规定了需要获取的 WHAT,而不关心 HOW,也就是只关注结果而不关注过程,因此SQL描述性的特点导致查询优化在数据库管理系统中具有非常重要的作用。

查询重写则是在逻辑执行计划的基础上进行等价的关系代数变换,这种优化也可以称为代数优化,虽然两个关系代数式获得的结果完全相同,但是它们的执行代价却可能有很大的差异,这就构成了查询重写优化的基础。

在早期的数据库管理系统中,通常采用基于启发式规则的方法来生成最优的物理执行计划,但是这种基于规则的优化的灵活度不够,常常产生一些次优的执行计划,而代价估算的引入,则从根本上解决了基于规则优化的不足。

基于代价的优化器一方面生成“候选”的物理执行路径,另一方面计算这些执行路径执行代价,这样就建立了执行路径的筛选标准,从而能够通过比较代价而获得最优的物理执行计划。

二、 SQL解析

SQL语句在数据库管理系统中的编译过程符合编译器实现的常规过程,需要进行词法分析、语法分析和语义分析。

  • 词法分析:从查询语句中识别出系统支持的关键字、标识符、运算符、终结符等,确定每个词固有的词性。
  • 语法分析:根据SQL的标准定义语法规则,使用词法分析中产生的词去匹配语法规则,如果一个 SQL 语句能够匹配一个语法规则,则生成对应的抽象语法树(Abstract Syntax Tree,AST)。
  • 语义分析:对语法树进行有效性检查,检查语法树中对应的表、列、函数、表达式是否有对应的元数据,将抽象语法树转换为逻辑执行计划(关系代数表达式)。 在SQL标准中,确定了SQL的关键字以及语法规则信息,SQL 解析器在做词法分析的过程中会将一个SQL语句根据关键字信息以及间隔信息划分为独立的原子单 位,每个单位以一个词的方式展现,例如有SQL语句:
SELECT w_name FROM warehouse WHERE w_no = 1;

该SQL语句可以划分的关键字、标识符、运算符、常量等原子单位如表1所示。

表 词法分析的特征

词性 内容
关键字 SELECT、FROM、WHERE
标识符 w_name、warehouse、w_no
操作符 =
常量 1

语法分析会根据词法分析获得的词来匹配语法规则,最终生成一个抽象语法树, 每个词作为语法树的叶子节点出现,如下图所示。

在这里插入图片描述

图 抽象语法树

抽象语法树表达的语义还仅仅限制在能够保证应用的SQL语句符合SQL标准的规范,但是对于SQL语句的内在含义还需要做有效性检查。

  • 检查关系的使用:FROM 子句中出现的关系必须是该查询对应模式中的关系或视图。
  • 检查与解析属性的使用:在SELECT语句中或者WHERE子句中出现的各个属性必须是FROM子句中某个关系或视图的属性。
  • 检查数据类型:所有属性的数据类型必须是匹配的。在有效性检查的同时,语义分析的过程还是有效性语义绑定(Bind)的过程,通过语义分析的检查,抽象语法树就转换成一个逻辑执行计划。逻辑执行计划可以通过关系代数表达式的形式来表现,如下图所示。

在这里插入图片描述

图 关系代数表达式

三、查询优化

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

  • 查询优化器和数据库开发人员之间存在信息不对称。查询优化器在优化的过程中会参考数据库统计模块自动产生的统计信息,这些统计信息从各个角度来描述数据的分布情况,查询优化器会综合考虑统计信息中的各种数据,从而得到一个比较好的执行方案,而数据库开发人员一方面无法全面地了解数据的分布情况,另一方面也很难通过统计信息构建一个精确的代价模型对执行计划进行筛选。
  • 查询优化器和数据库开发人员之间的时效性不同。数据库中的数据瞬息万变,一个在 A 时间点执行性能很高的执行计划,在B时间点由于数据内容发生了变化,它的性能可能就很低,查询优化器则随时都能根据数据的变化调整执行计划,而数据库应用程序开发人员则只能手动地调整SQL语句,和查询优化器相比,它的时效性比较低。
  • 查询优化器和数据库开发人员的计算能力不同。目前计算机的计算能力已经大幅提高,在执行数值计算方面和人脑相比具有巨大的优势,查询优化器对一个 SQL语句进行优化时,可以从成百上千个执行方案中选择一个最优方案,而人脑要计算这几百种方案需要的时间要远远长于计算机。

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

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

  • RBO(Rule Based Optimization,基于规则的查询优化):根据预定义的启发式规则对SQL语句进行优化。
  • CBO(CostBasedOptimization,基于代价的查询优化):对SQL语句对应的待选执行路径进行代价估算,从待选路径中选择代价最低的执行路径作为最终的执行计划。
  • ABO(ai Based Optimization,基于机器学习的查询优化):收集执行计划的特征信息,借助机器学习模型获得经验信息,进而对执行计划进行调优,获得最优的执行计划。

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

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

查询优化的详细内容将在下一篇内容进行介绍。

Gauss松鼠会是汇集数据库爱好者和关注者的大本营,大家共同学习、探索、分享数据库前沿知识和技术,互助解决问题,共建数据库技术交流圈。

您可能感兴趣的文档:

--结束END--

本文标题: openGauss SQL引擎 (上)

本文链接: https://www.lsjlt.com/news/8353.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • openGauss SQL引擎 (上)
    ...
    99+
    2015-03-19
    openGauss SQL引擎 (上)
  • openGauss SQL引擎(下)——查询优化
    ...
    99+
    2019-09-04
    openGauss SQL引擎(下)——查询优化
  • MySQL-SQL InnoDB引擎 (上)
    ♥️作者:小刘在C站 ♥️个人主页: 小刘主页  ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术 ♥️小刘私信可以随便...
    99+
    2023-09-01
    数据库 sql mysql
  • SQL引擎是什么
    本篇内容介绍了“SQL引擎是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景介绍使用SQL 引擎一词是有点随意的。例如Hive 不是一...
    99+
    2023-06-27
  • MySQL-SQL InnoDB引擎 (中)
    ♥️作者:小刘在C站 ♥️个人主页: 小刘主页  ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术 ♥️小刘私信可以随便问,只要会...
    99+
    2023-08-31
    数据库 mysql sql
  • MySQL—存储引擎(上)
    ♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️树高千尺,落叶归根人生不易,人间真情 目录 1). 连接层 2). 服务层 ...
    99+
    2023-09-07
    服务器 运维 mysql
  • Case:MySQL Federated存储引擎引起的慢SQL优化
    这个案例并不是我遇到的,但是我的工作生产环境中有使用到federated存储引擎,所以记录一下。优化前有一条SQL部分截取内容如下,执行约268秒才能出结果:优化后从这条SQL的执行计划中可以看出来mego...
    99+
    2022-10-18
  • sql语法解析引擎怎么实现
    SQL语法解析引擎是一种解析输入的SQL语句,并将其转换成可执行的指令或查询计划的软件组件。它通常由以下几个步骤组成:1. 词法分析...
    99+
    2023-10-11
    sql
  • 如何自己动手写SQL执行引擎
    目录前言整体结构MySQL Protocol结构B+Tree的磁盘结构事务支持尾声前言 在阅读了大量关于数据库的资料后,笔者情不自禁产生了一个造数据库轮子的想法。来验证一下自己对于数...
    99+
    2022-11-12
  • SQL Server存储过程(数据库引擎)使用详解
    存储过程(数据库引擎) 一、背景知识1.1、使用存储过程的好处1.2、存储过程的类型 二、创建存储过程三、修改存储过程四、删除存储过程五、执行存储过程5.1、建议5.2、使用 Transa...
    99+
    2023-10-01
    数据库 sql 服务器 sqlserver 大数据
  • 【已解决】SQL SERVER2008 连接不了本地数据引擎
    几经摸索,找到了一些解决方法 1. 在系统服务中启动SQL Server代理 在服务中找到SQL Server代理,并且启动它 2. 在 Sql Server Configuration Manager中启动服务 如果在系统服务中启动不...
    99+
    2014-06-11
    【已解决】SQL SERVER2008 连接不了本地数据引擎
  • GAIA-IR: GraphScope 上的并行化图查询引擎
    在本文中,我们将介绍 GraphScope 图交互式查询引擎 GAIA-IR,它支持高效的 Gremlin 语言表达的交互图查询,同时高度抽象了图上的查询计算,具有高可扩展性。 在本文中,我...
    99+
    2018-11-27
    GAIA-IR: GraphScope 上的并行化图查询引擎
  • 怎么在MySQL数据库上配置Federated引擎
    本篇内容介绍了“怎么在MySQL数据库上配置Federated引擎”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2022-10-18
  • 如何在引擎BAE上搭建或迁移WordPress
    本篇内容介绍了“如何在引擎BAE上搭建或迁移WordPress”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!安装配置WordPress1.注...
    99+
    2023-06-10
  • CentOS上的安装和配置MYSQL 支持 INNODB引擎
    安装MYSQL数据库,详细参考:   http://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html &n...
    99+
    2022-10-18
  • 如何理解分布式SQL大数据查询引擎的发展
    本篇内容主要讲解“如何理解分布式SQL大数据查询引擎的发展”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解分布式SQL大数据查询引擎的发展”吧!介绍从高层...
    99+
    2022-10-18
  • 如何进行MySQL INNODB存储引擎中各类型SQL加锁分析
    这篇文章给大家介绍如何进行MySQL INNODB存储引擎中各类型SQL加锁分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 MYSQL5.6事物隔离级...
    99+
    2022-10-19
  • 如何在Linux上检查MySQL数据表的存储引擎类型
    本篇内容主要讲解“如何在Linux上检查MySQL数据表的存储引擎类型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何在Linux上检查MySQL数据表的存储引擎类型”吧!提问: 我想要知道我...
    99+
    2023-06-16
  • 怎么在Linux上检查MySQL数据表的存储引擎类型
    这篇文章的内容主要围绕怎么在Linux上检查MySQL数据表的存储引擎类型进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!MySQl主要使用两种存储引...
    99+
    2023-06-28
  • MySQL存储引擎 SQL数据导入/导出 操作表记录 查询及匹配条件
    MySQL存储引擎的配置 SQL数据导入/导出 操作表记录 查询及匹配条件 1 MySQL存储引擎的配置1.1 问题 本案例要求MySQL数据存储引擎的使用,完成以下任务操作: 可用的存储引擎类型 查看默认...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作