首页 > 数据库 >openGauss的SQL引擎在3.1.0版本中做了哪些优化?

openGauss的SQL引擎在3.1.0版本中做了哪些优化?

时间:2023-08-05 15:32:55浏览次数:57  
标签:迭代 SQL 分区 算子 分区表 3.1 openGauss 数据库 页面

openGauss的SQL引擎在3.1.0版本中做了哪些优化?

收录于合集#技术干货83个

查询执行能力对数据库来说至关重要,这直接决定了查询语句生成的执行计划以何种方式进行执行,如果哪个执行算子的执行表现不好,将会对数据库的整体性能产生极大的影响。同时,执行算子的实现也极大考验一款数据库的工程实现能力。为此,openGauss数据库在3.1.0版本中,进一步优化了当前的部分执行算子,并希望通过优化执行算子的实现,来提高数据库的整体表现。下面介绍一下在该版本中,openGauss数据库都做了哪些SQL引擎的优化。

分区表页面估算优化

目前分区表的统计信息,代价模型使用的是普通表的机制,由于分区表和普通表结构上的不同,所以不能完全依赖普通表的机制去处理分区表的代价问题。由于分区表存在天然的分区优势,所以在分区剪枝的情况下,SQL语句在查询过程中不会访问所有分区。对于分区存在剪枝的场景,分区表页面统计时就不能单纯的统计所有分区的页面。在剪枝场景下只需要统计剪枝后的分区页面数即可。由于目前分区表没有统计每个分区的页面数,因此基于均匀性假设(分区页面不倾斜),用以下公式估算分区页面数:

剪枝后分区页面数 = 分区表总页面数 * (剪枝后分区数 / 总分区数)

通过改进分区表页面的估算方法,可以优化数据库的表扫描性能,从而提升数据库在分区表场景中的执行表现。该特性可通过GUC参数partition_page_estimation控制。

Partition Iterator算子优化

在openGauss数据库中,分区表是依靠分区迭代算子进行分区扫描的,迭代算子控制每一个分区依次扫描数据。当分区剪枝结果只有一个分区时,迭代算子已经失去了迭代器的作用,在此情况下消除迭代算子,可以避免执行时迭代算子计算的开销。由于执行器的pipeline架构,迭代算子会被重复执行,在数据量比较大的场景下消除迭代算子的收益将十分可观。故在该版本中,我们通过对迭代算子进行改进,消除分区扫描时的overhead,进而提升数据库在该场景下的执行性能。该特性可通过GUC参数partition_iterator_elimination控制。

SeqScan算子优化

开启该优化,当用户不采集cpu信息时(例如explain cpu off),关闭cpu信息采集功能(例如执行CPUUsageGetCurrent函数),从而减少cpu执行周期。该特性不影响正常的cpu信息采集,相关监控视图和系统函数不受影响。同时,从磁盘读取数据时,优化mdread机制,减少冗余的checksum检查,进而通过消除无用的操作来提升数据库性能。该特性可通过GUC参数enable_seqscan_fusion控制。

标签:迭代,SQL,分区,算子,分区表,3.1,openGauss,数据库,页面
From: https://blog.51cto.com/u_16191492/6975986

相关文章

  • 金奖方案 | 一专多能、傲视寰宇,南大通用GBase8c数据库牛在哪里?opengauss
    金奖方案|一专多能、傲视寰宇,南大通用GBase8c数据库牛在哪里?opengaussopenGauss2022-11-0420:59发表于四川鲲鹏应用创新大赛是面向全球开发者的顶级赛事,本次大赛由21个鲲鹏生态创新中心与华为,联合中国软件行业协会、绿色计算产业联盟、中国计算机行业协会、中国计算机学会高专......
  • 数据库迁移系列】从MySQL到openGauss的数据库对象迁移实践
    数据库迁移系列】从MySQL到openGauss的数据库对象迁移实践原创酷哥[openGauss](javascript:void(0);)2022-11-0718:03发表于广东9月30日新发布的openGauss3.1.0版本,工具的全量迁移和增量迁移的性能不但有了全面提升,而且支持数据库对象视图、触发器、自定义函数、存储过程的......
  • openGauss —— 智能优化器之基数估计
    openGauss——智能优化器之基数估计现代数据库优化器主要依赖于其内部的代价估计系统,而代价估计最重要的依据就是查询算子的基数,即数据通过算子内查询条件过滤之后剩余的结果行数。因此基数估计技术是影响优化器产生的执行计划性能最关键的技术。学术界和工业界针对基数估计技术......
  • openGauss赋能企业核心场景应用 | 华为全联接大会2022专题回顾
    openGauss赋能企业核心场景应用|华为全联接大会2022专题回顾[openGauss](javascript:void(0);)2022-11-0920:10发表于广东今日,华为全联接大会openGauss主题论坛在线上成功举行。openGauss相关专家、伙伴、行业用户围绕openGauss社区进展、openGauss3.1版本技术创新,基于openGau......
  • SQL-去除最大值与最小值求均值的问题
    背景今天有同事问我一道关于数据库SQL的面试题,我刚开始随便给了一个思路,后来思索发现这个思路有漏洞,于是总结下来,仅供参考。问题:薪水表中是员工薪水的基本信息,包括雇员编号,和薪水,查询除去最高、最低薪水后的平均薪水。一、薪水表信息CREATETABLE`salaries`(`emp_n......
  • Docker-Compose 一键部署mysql及初始化sql脚本
    1.部署前提:服务器具备docker和docker-compose环境2.镜像准备:-mysql:DockerFile文件:FROMmysql:5.7.41COPY*.sql/docker-entrypoint-initdb.d/初始化sql脚本xxx.sql放在DockerFile文件同级目录下执行指令:dockerbuild-fdockerfile_mysql-tmysql:1.0.0.......
  • Sqlmap的使用
    1、get型提交sqlmap.py-u+网址sqlmap.py-uhttp://127.0.0.1/sqli/Less-1/?id=1参数levellevel的等级越高,测试的等级越广,>=2时会检查cookie里的参数>=3时检查user-agent和refereer--dbs              查询所有的数据库sqlmap.py-uhttp://127.0.0.1/sql......
  • 老派Sql之必要,逆天,我在ef core中使用ado.net!
    Wlkr.Core.EFCore逆天,我在efcore中使用ado.net!老派Sql之必要当你开发生涯中基本只用一两种数据库当你觉得用EF的类写报表时很别扭当你觉自己的Sql(Server)语句写得出神入化当你觉自己的Sql(Server)语句比EF生成的更优化当你刚从.netframework转.netcore,还不知道sqls......
  • MySql之锁
    MySql之锁一、全局锁对整个数据库加锁应用:数据库所有表备份二、表级锁1.表锁分为两类:表共享读锁readlock表独占写锁writelock2.元数据锁避免DML语句和DDL语句的冲突问题3.意向锁:作用:针对行锁和表锁,当表中有行锁时,会同时加一把意向锁,表锁不用去逐行遍历是否加了行锁,......
  • 最简单的Qt连接MYSQL的方法
    最简单的Qt连接MYSQL的方法⭐当我试图在项目中连接本地的mysql时,反复出现:QMYSQLdrivernotloaded,显示没有成功加载mysql的驱动,在网上查询了很多教程和视频,大多为互相转载且老旧,耗费了大半天还是没有构建成功,通常的解决方法是在本地构建mysql驱动(通过安装qt时勾选的src选项里......