听说换上人大金仓“自动挡”,效率提升4000多倍!

news2024/10/5 19:11:32

前情提要

随着数据规模以及应用业务场景复杂度的不断增加,更大规模数据量的数据库应用场景出现,对于传统关系型数据库的优化能力要求也更高。

因为SQL是解释性语言,用户可以指定要什么,而无需关心如何达成目的。所以对于同样一条SQL,数据库可以有大量的执行计划返回同样的结果,而这些计划对应的时间可能产生数量级差异,因此优化器就显得尤为重要。

问题往往就出现在优化器无法给出最优的执行计划,而基数估计则是优化器的阿喀琉斯之踵。

“基数估计”的特殊情况

自SYSTEM-R诞生以来,基数估计的理论就开始逐渐的走向成熟。传统的基数估计基本思想是在不真正执行SQL语句的基础上,快速而准确的估算出各种算子(扫描、连接、聚集等)的选择率,进而为代价计算服务。

计算选择率则需要统计信息和选择率计算公式,直方图和MCV等统计信息技术应用而生,相应的针对不同的操作符、操作符组合、算子的选择率计算公式也随之出现。

2b7091984a7eb6b134d561109c6664b9.png

高频值MCV信息

d9c3c5cce7759f930587b872c55714fb.jpeg

直方图信息

基于上述技术,大部分情况下基数估计与实际值基本一致,但是现实情况是复杂的,不可避免的会出现一些特殊情况:

如该例中,T1、T2表做连接操作,其中T1表由于约束条件的复杂性,传统方案无法准确估算出准确基数内容,rows的估算值和实际值相差甚远,T1因rows估算值过大,作为外表进行nestloop连接。

2145a9ff2a9ff8777cada501ac97f80d.png

此时,T1的rows实际值是远低于T2的,按照nestloop连接原理,应当作为内表进行连接操作,但由于基数估计错误,使得计划选择错误。那么如何解决基数估计错误的相关问题呢?

传统“手动挡”方案

当遇到传统性能问题时,运维人员会根据问题原因进行手动调节,就基数估计错误的部分场景,金仓数据库也提供了诸多“手动挡”方案:

① 指数补偿 vs 复杂约束条件

传统数据库使用完全独立假设计算选择率,其计算公式如下:

基数估算值 = p0×p1×p2×…×原有数据量

但随着约束条件增多,或是约束条件之间关联性更强,其假设的基数估计偏差可能也会越大,金仓数据库采用指数补偿来弥补这一缺陷。但ROWS的估算内容与真实值还是有较大偏差。

a176306adf648de1d2635b45b12f6ee7.png传统解决方案

6686fe579acdea934f761f6d707f8e97.png使用指数补偿

② 扩展统计信息 vs 函数依赖

如出现函数依赖的统计信息内容,例如:当a等于1时,b也一定等于1,金仓数据库提供了扩展统计信息来进行优化。但扩展统计信息解决的基数估计内容非常有限。

7fa7804b1d363ddbfe94ec878069497c.png传统方案

7e5f33f1e4a3947a968baf3bb8b4b63e.png使用扩展统计信息

③ “万金油”HINT

当出现基数估计不准,运维人员可锁定问题位置,直接使用ROWS HINT进行基数估计修正。如刚刚提到的两个示例,可用HINT直接修正:

ae94a4c84dfd5501c05f6fca5e75fd1e.png

b8a2d7383f7dc170dd7a3b706824eca7.pngHINT解决前两个问题

但当出现系统自命名的表信息,如连接表的基数估计修正,或是面对更加庞大的SQL集合,凭借运维人员独立筛选,效率极低。

68252f3cf429682c0ff0e62c28ee62ce.pngHINT处理系统自命名信息

以上方案都可以解决一部分基数估计错误的场景,但在解决问题上,一方面对运维人员有较高的要求;另一方面,大部分方案的应用场景有限;传统数据库要想“破局”,必须探索其他办法修正基数估计错误的问题。

金仓“自动挡”方案

我们在传统“手动挡”方案中,提到了“万金油”HINT,其最大的作用就是修正单个SQL语句中,执行计划不准的问题,只是需要运维人员先做诊断,再对症下药。那为何不将“手动”变为“自动”?为ROWS类型HINT修正加一个触发器,自动扫描并更正基数估计错误的内容!

f1c76112d3d385e683200bcb6cbf3b7c.png

说干就干!金仓数据库推出了“自适应基数估计”,在执行过程中收集更多统计信息,让静态决策变为动态决策,根据运行时的真实信息调整执行计划,Plan 由真实的数据本身在运行时决定,不同的数据会拥有不同的执行策略。

“自适应基数估计”,主要包含两大功能:

给出HINT建议

当使用explain (analyze,hint)时,倘若出现基数估计错误时,会自动给出HINT建议,当用户将自适应基数估计特性关闭后,可使用这些HINT建议控制SQL语句使用优化后的执行计划。

自动修正错误的执行计划

第一次执行SQL语句,优化器使用缺省的基数估计算法来估计基数。当该语句执行完成后,会使用实际的返回行数和基数估计值进行比较,将基数估计不准确的运算节点的基数值进行修正,来保证第二次执行相同的SQL语句时,基数估计准确。

那么我们来回看传统数据库解决的方案问题,当开启基数估计自适应时,都自动定位到了基数估计不准的位置,并予以修正。

① 自适应基数估计 vs 复杂约束条件

d3538346a2c2504bdbfa4b98d62faa28.png

② 自适应基数估计 vs函数依赖

2d21474c0333c2d53dc11fc0e4a12369.png

③ 自适应基数估计 vs HINT修正困难问题

90e273f058ff092c6cfc4aa624387245.png

应用自适应基数估计后,数据库将自动检测并使用真实值,使得估算差距较大的rows及时得到更正,从而使得选择率计算准确,计划选择更精准,分析更快速,该方案可以高效解决所有基数估计错误的场景。

快来看看实际案例的情况吧~

当前,金仓数据库内核中已添加了基数估计内容的自适应基数估计功能,并于近期在某行业核心应用的性能优化上,取得显著效果。面对系统中多条SQL的优化问题,自适应基数估计功能快速定位并自行修正了因统计信息不准造成的执行计划选择问题。

aee1e63bf248df2e1b8ec8ba126cd214.png

bb5866c4d6c015f5172d64b8cfb6ff12.png

其中较为明显的用例如上(其数据及表信息内容已脱敏):因多函数条件造成的估算不准问题,当基数估计修改后,计划选择由NestLoop更正为HashJoin,效率提升4000多倍!

1

END

1

传统数据库在面对统计信息缺失或者不准的问题,能做的只有使统计信息变准、不断优化算法,但面对众多业务场景下SQL种类复杂的情况,难以实现真正的“准”。而自适应基数估计在信息收集的准确性、及时性基础上,自动对基数估计错误内容进行检测,并提供相应的解决方案,提升数据处理的效率,有效缩短运维响应的时间,帮助企业把关注点从数据库和平台层转回,更多关注到业务和应用。

当然,该功能的内容、应用场景还有待拓宽,未来金仓会结合前沿理论,通过各类实际案例的应用实践,在自感知、自诊断、自建议、自优化等方面,不断增强与完善,使数据库更智能,为运维人员及用户提供更好的使用体验,为实现数据库“全自动”不断前进!

f486b4ed080655aa17717acb6da3f086.png供稿:产品研发中心

编辑:王堇

审核:日尧

5953860896d1a86631685be4a798086f.gif

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

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

相关文章

录取结果怎么公布?这个技术可以轻松实现

对于录取结果的公布,一直是考生和家长重点关注的话题,因此学校公布录取情况的方式和效果也一直是学校工作的重点和难点,传统的公布方式涉及技术开发和服务器搭建,开发周期也较长!一般有经验的老教师都会选择使用易查分…

分布式 - 消息队列Kafka:Kafka 消费者消费位移的提交方式

文章目录 1. 自动提交消费位移2. 自动提交消费位移存在的问题?3. 手动提交消费位移1. 同步提交消费位移2. 异步提交消费位移3. 同步和异步组合提交消费位移4. 提交特定的消费位移5. 按分区提交消费位移 4. 消费者查找不到消费位移时怎么办?5. 如何从特定…

JavaSE-17 【异常】

第一章 什么是异常 1.1 异常的概念 异常:指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止 在Java中,异常本身就是一个类,产生异常就是创建一个异常对象并且抛出一个异常对象的过程 Java处理…

如何快速高效地进行 API 自动化测试

我们的研发团队最需要应对的就是各种新需求。软件越来越快的更新速度也让整个系统也变得越来越复杂,这让 测试 工作面临着巨大的挑战。测试人员必须与开发人员沟通,确定测试范围,并及时获取最新的接口用例数据来验证功能。但是,由…

【Apollo】Apollo版本特点与改进

特点与改进 概述里程碑6.0版本特点及改进7.0版本特点及改进8.0版本特点及改进代码差异 主页传送门:📀 传送 概述 Apollo (阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快…

【Web开发指南】MyEclipse XML编辑器的高级功能简介

MyEclipse v2023.1.2离线版下载 1. 在MyEclipse中编辑XML 本文档介绍MyEclipse XML编辑器中的一些可用的函数,MyEclipse XML编辑器包括高级XML编辑,例如: 语法高亮显示标签和属性内容辅助实时验证(当您输入时)文档内容的源(Sou…

协同过滤推荐算法-基于Django+mysql的智能水果销售系统设计(可做计算机毕设)

随着科技的不断发展,智能化已经成为各行各业的趋势,水果销售行业也不例外。智能水果销售系统就是应运而生的一种智能化解决方案,它可以为用户提供更加便捷、高效的购物体验。其中,系统模块是智能水果销售系统的重要组成部分。 系…

postgresql 谨慎使用正则删除(%,_)

建表 CREATE TABLE public.ellistest (id bigserial NOT NULL,"name" varchar null,primary key (id) );插入数据 删除含有_线的数据 你会发现表被清空了 delete from ellistest where name like %_%原因 百分号(%)用于表示0、1或多个字符或数字。 下划线通配符…

Java【动态规划】图文详解 “路径问题模型“ , 教你手撕动态规划

文章目录 一、不同路径I1, 题目2, 思路分析2.1, 状态表示2.2, 状态转移方程2.3, 初始化2.4, 填表顺序2.5, 返回值 3, 代码 二、不同路径II1, 题目2, 思路分析2.1, 状态表示2.2, 状态转移方程2.3, 初始化2.4, 填表顺序2.5, 返回值 3, 代码 三、礼物最大价值1, 题目2, 思路分析2.…

从零基础到精通IT:探索高效学习路径与成功案例

文章目录 导语:第一步:明确学习目标与方向选择适合的IT方向设定具体的学习目标咨询和调研 第二步:系统学习基础知识选择适合的编程语言学习数据结构和算法掌握操作系统和计算机网络基础 第三步:实践项目锻炼技能选择合适的项目编写…

C语言:初阶测试错题(查漏补缺)

题一:字符串倒置 示例1 输入 I like beijing. 输出 beijing. like I 思路一: 定义字符串数组arr[ ] ,利用gets()将要倒置的字符串输入,记录字符串长度len,此时写一个逆置函数Inversion(),第一步将整个字符串逆置&…

基于决策树(Decision Tree)的乳腺癌诊蚓

决策树(DecisionTree)学习是以实例为基础的归纳学习算法。算法从--组无序、无规则的事例中推理出决策树表示形式的分类规则,决策树也能表示为多个If-Then规则。一般在决策树中采用“自顶向下、分而治之”的递归方式,将搜索空间分为若千个互不相交的子集,在决策树的内部节点(非叶…

C语言刷题训练DAY.7

1.及格分数 解题思路&#xff1a; 这里直接用while语句控制循环&#xff0c;if else语句判断即可。 解题代码&#xff1a; #include<stdio.h> int main() {int a 0;while(scanf("%d", &a) ! EOF){if (a >60)printf("Pass\n");elseprintf…

HCIP学习--交换技术

前置学习 HICA学习&#xff08;第一天&#xff09;--网络基础_板栗妖怪的博客-CSDN博客 HCIA学习--VLAN一些常识及在ensp上实现VLAN配置_ensp vlan_板栗妖怪的博客-CSDN博客 一个小知识 在一个公司内部使用的路由技术很少&#xff0c;用的是交换技术&#xff0c;使用几个三…

【gitkraken】gitkraken自动更新问题

GitKraken 会自动升级&#xff01;一旦自动升级&#xff0c;你的 GitKraken 自然就不再是最后一个免费版 6.5.1 了。 在安装 GitKraken 之后&#xff0c;在你的安装目录&#xff08;C:\Users\<用户名>\AppData\Local\gitkraken&#xff09;下会有一个名为 Update.exe 的…

【从零学习python 】47. 面向对象编程中的继承概念及基本使用

文章目录 继承的基本使用代码逐行讲解说明:进阶案例 继承的基本使用 在现实生活中&#xff0c;继承一般指的是子女继承父辈的财产&#xff0c;父辈有的财产&#xff0c;子女能够直接使用。 程序里的继承 继承是面向对象软件设计中的一个概念&#xff0c;与多态、封装共为面向对…

在远程服务器上安装环境

第一步&#xff1a;下载anaconda 进入官网https://www.anaconda.com/download#downloads,点击linux的小企鹅 选择下载linux64位版本。 第二步&#xff1a;安装 打开xftp&#xff0c;将文件上传到服务器中。 然后在你自己的文件夹中输入bash Anaconda3-2023.07-2-Linux-x86…

视频云存储/视频汇聚/视频监控EasyCVR平台CDN转推的操作流程

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等&#xff0c;视频智能分析平台EasyCVR融合性强、开放度…

ARM体系结构学习笔记:寄存器

前段时间通篇概览一遍汇编语言程序设计——基于ARM体系结构(第4版), 总感觉纸上得来终觉浅, 并不能够让我产生一种读汇编就跟读C代码一样那种流畅的感觉. 如果我们越熟悉, 越发觉得他们是有规律可循的, 这里做一下对应的记录, 互相共勉. 通用寄存器并不通用 表面上arm为我们提…