300 倍的性能提升!PieCloudDB Database 优化器「达奇」又出新“招”啦

news2024/12/23 1:28:04

随着数字化进程的加快,全球数据量呈指数级增长,对数据库系统的性能提出了巨大的挑战。优化器作为数据库管理系统中的关键技术,对数据库性能和效率具有重要影响,它通过对用户的查询请求进行解析和优化来生成高效的执行计划,进而快速返回查询结果。然而,同一条 SQL 语句在不同的优化决策下可能会产生数量级的性能差异。随着数据规模和查询复杂性的增加,优化器的不断发展和创新将成为数据库系统持续提升性能的重要方向,也是数据库系统的最强有力的竞争力之一。

针对云原生和分布式场景,云原生虚拟数仓 PieCloudDB Database 设计与打造了新一代优化器:「达奇」。这个命名灵感来自于游戏《荒野大镖客》中的一个 NPC 角色,他的口头禅 “I have a plan” 与优化器的功能非常契合。

优化器「达奇」在 PieCloudDB 中实现了许多优化特性,通过生成高质量的查询计划,充当数据库系统的 “智囊团”,确保用户的查询性能和效率。「达奇」通过智能地分析查询语句、优化查询计划以及利用分布式数据存储和计算能力,实现了更快速、更高效的查询处理。

拓数派吉祥物「派派」

1 聚集操作与聚集下推

今天,我们将详细介绍「达奇」的全新功能:聚集下推。在现代的数据库系统中,聚集操作(Aggregate)是非常常见的一种操作类型。通过聚集操作,可以把多行数据合并成一行,并对其进行统计、求和、求均值等计算。

在传统的查询执行过程中,聚合操作通常在查询结果返回后进行,需要将所有数据传输至查询引擎进行聚合计算。然而,对于大规模数据集和复杂查询,这种方式可能导致查询性能低下、计算负载过高和计算成本昂贵等问题。

为了解决这些问题,PieCloudDB 优化器「达奇」打造了聚集下推(Aggregate Pushdown)这一功能,经测试,在很多场景下,聚集下推功能会取得百倍甚至千倍的性能提升。

2 聚集下推原理

聚集下推(Pushdown Aggregation)是一种数据库查询优化技术,通过将聚合操作下推至数据源,减少数据传输和处理的开销,从而提高查询性能和效率。

聚集下推的实现原理是在查询执行过程中尽可能早地进行聚合操作,并将聚合操作下推至数据源进行处理。具体而言,当查询计划生成时,优化器会将聚合操作下推至数据源,以便在数据源处进行聚合计算。这样可以减少数据传输量,减轻查询引擎的负担,并利用数据源的计算能力进行局部聚合。

下面我们用一个简单的图示,来讲解聚集下推的主要实现原理:

有无「聚集下推」对比

上图中,左图是没有聚集下推的执行流程,右图是有聚集下推时的执行流程。在左图没有聚集下推的情况下,表 T1 和 T2 会先做连接操作,并在连接之后的数据集上完成聚集操作。

而在右图有聚集下推的情况下,会在对表 T1 和 T2 进行连接操作之前,先对表 T1 做一次聚集操作。这样可以在某些场景下使得连接操作时表 T1 中参与的数据量极大的减少,从而显著提高查询性能。为了能准确地提高查询效率,以上两种执行方案在「达奇」中都会生成,最后会根据代价模型的估算选择代价较小的执行方案。

当有更多的表参与连接时,「达奇」会尝试把聚集操作下推到不同的连接层,通过代价的比较来选定最优的下推位置。

3 聚集下推演示实例

下面,我们通过一个查询实例来看一下聚集下推的效果。首先,我们通过下面语句来创建测试用表:

CREATE TABLE t (x int, y int);
INSERT INTO t SELECT i % 30, i % 30 FROM generate_series(1, 10240) i;
ANALYZE t;

测试所用的查询如下:

SELECT t1.x, sum(t2.y + t3.y), count(*) FROM t t1 
JOIN t t2 ON t1.x = t2.x JOIN t t3 ON t2.x = t3.x 
GROUP BY t1.x;

当没有聚集下推时,查询计划如下:

EXPLAIN (ANALYZE, COSTS OFF) 
SELECT t1.x, sum(t2.y + t3.y), count(*) FROM t t1 JOIN t t2 ON t1.x = t2.x JOIN t t3 ON t2.x = t3.x GROUP BY t1.x; 

                                                        QUERY PLAN 

--------------------------------------------------------------------------------------------------------------------------- 

Gather Motion 3:1  (slice1; segments: 3) (actual time=153884.859..274102.066 rows=30 loops=1) 
   ->  HashAggregate (actual time=274100.004..274100.011 rows=12 loops=1) 
         Group Key: t1.x 
         Peak Memory Usage: 0 kB 
         ->  Hash Join (actual time=38.717..100579.782 rows=477571187 loops=1) 
               Hash Cond: (t1.x = t3.x) 
               Extra Text: (seg0)   Hash chain length 341.4 avg, 342 max, using 12 of 131072 buckets. 
               ->  Hash Join (actual time=2.088..429.203 rows=1398787 loops=1) 
                     Hash Cond: (t1.x = t2.x) 
                     Extra Text: (seg0)   Hash chain length 341.4 avg, 342 max, using 12 of 131072 buckets. 
                     ->  Redistribute Motion 3:3  (slice2; segments: 3) (actual time=0.044..4.590 rows=4097 loops=1) 
                           Hash Key: t1.x 
                           ->  Seq Scan on t t1 (actual time=1.382..32.683 rows=3496 loops=1) 
                     ->  Hash (actual time=1.760..1.761 rows=4097 loops=1) 
                           Buckets: 131072  Batches: 1  Memory Usage: 1185kB 
                           ->  Redistribute Motion 3:3  (slice3; segments: 3) (actual time=0.049..0.922 rows=4097 loops=1) 
                                 Hash Key: t2.x 
                                 ->  Seq Scan on t t2 (actual time=1.628..32.837 rows=3496 loops=1) 
               ->  Hash (actual time=36.153..36.153 rows=4097 loops=1) 
                     Buckets: 131072  Batches: 1  Memory Usage: 1185kB 
                     ->  Redistribute Motion 3:3  (slice4; segments: 3) (actual time=3.918..35.169 rows=4097 loops=1) 
                           Hash Key: t3.x 
                           ->  Seq Scan on t t3 (actual time=1.380..30.316 rows=3496 loops=1) 

Planning Time: 8.810 ms 
   (slice0) Executor memory: 257K bytes. 
   (slice1) Executor memory: 2484K bytes avg x 3 workers, 2570K bytes max (seg0).  Work_mem: 1185K bytes max. 
   (slice2) Executor memory: 32840K bytes avg x 3 workers, 32841K bytes max (seg0). 
   (slice3) Executor memory: 32860K bytes avg x 3 workers, 32860K bytes max (seg0). 
   (slice4) Executor memory: 32860K bytes avg x 3 workers, 32860K bytes max (seg0). 

Memory used:  128000kB 
Optimizer: Postgres query optimizer 
Execution Time: 274130.589 ms
(32 rows) 

而当有聚集下推时,查询计划如下:

EXPLAIN (ANALYZE, COSTS OFF) 
SELECT t1.x, sum(t2.y + t3.y), count(*) FROM t t1 JOIN t t2 ON t1.x = t2.x JOIN t t3 ON t2.x = t3.x GROUP BY t1.x; 

                                                                      QUERY PLAN 

---------------------------------------------------------------------------------------------------------------------------------------------------------- 

Gather Motion 3:1  (slice1; segments: 3) (actual time=835.755..836.406 rows=30 loops=1) 
   ->  Finalize GroupAggregate (actual time=834.227..835.432 rows=12 loops=1) 
         Group Key: t1.x 
         ->  Sort (actual time=834.031..834.441 rows=4097 loops=1) 
               Sort Key: t1.x 
               Sort Method:  quicksort  Memory: 1266kB 
               ->  Redistribute Motion 3:3  (slice2; segments: 3) (actual time=812.139..830.706 rows=4097 loops=1) 
                     Hash Key: t1.x 
                     ->  Hash Join (actual time=810.536..828.097 rows=3496 loops=1) 
                           Hash Cond: (t1.x = t2.x) 
                           Extra Text: (seg0)   Hash chain length 1.0 avg, 1 max, using 30 of 131072 buckets. 
                           ->  Seq Scan on t t1 (actual time=1.689..16.674 rows=3496 loops=1) 
                           ->  Hash (actual time=808.497..808.498 rows=30 loops=1) 
                                 Buckets: 131072  Batches: 1  Memory Usage: 1026kB 
                                 ->  Broadcast Motion 3:3  (slice3; segments: 3) (actual time=461.065..808.466 rows=30 loops=1) 
                                       ->  Partial HashAggregate (actual time=810.026..810.033 rows=12 loops=1) 
                                             Group Key: t2.x 
                                             Peak Memory Usage: 0 kB 
                                             ->  Hash Join (actual time=28.070..331.181 rows=1398787 loops=1) 
                                                   Hash Cond: (t2.x = t3.x) 
                                                   Extra Text: (seg0)   Hash chain length 341.4 avg, 342 max, using 12 of 262144 buckets. 
                                                   ->  Redistribute Motion 3:3  (slice4; segments: 3) (actual time=0.040..1.270 rows=4097 loops=1) 
                                                         Hash Key: t2.x 
                                                         ->  Seq Scan on t t2 (actual time=1.449..19.963 rows=3496 loops=1) 
                                                   ->  Hash (actual time=27.834..27.835 rows=4097 loops=1) 
                                                         Buckets: 262144  Batches: 1  Memory Usage: 2209kB 
                                                         ->  Redistribute Motion 3:3  (slice5; segments: 3) (actual time=3.836..27.025 rows=4097 loops=1) 
                                                               Hash Key: t3.x 
                                                               ->  Seq Scan on t t3 (actual time=1.537..23.654 rows=3496 loops=1) 

Planning Time: 14.425 ms 
   (slice0)    Executor memory: 328K bytes. 
   (slice1)    Executor memory: 408K bytes avg x 3 workers, 514K bytes max (seg0).  Work_mem: 450K bytes max. 
   (slice2)    Executor memory: 33951K bytes avg x 3 workers, 33952K bytes max (seg0).  Work_mem: 1026K bytes max. 
   (slice3)    Executor memory: 2298K bytes avg x 3 workers, 2341K bytes max (seg0).  Work_mem: 2209K bytes max. 
   (slice4)    Executor memory: 32860K bytes avg x 3 workers, 32860K bytes max (seg0). 
   (slice5)    Executor memory: 32860K bytes avg x 3 workers, 32860K bytes max (seg0). 

Memory used:  128000kB 
Optimizer: Postgres query optimizer 
Execution Time: 865.305 ms 
(39 rows) 

通过两个查询计划的对比,可以看到,当没有聚集下推时(查询计划 1),需要先完成所有的连接操作,再在连接的数据集上进行聚集操作。而聚集下推(查询计划 2)可以把聚集操作下推到最优的连接层,从而减少后续连接操作的数据量,可以显著地提升性能。

在这个例子中,「达奇」把聚集操作下推到了 t2 和 t3 连接之后,与 t1 连接之前。通过对比这两个执行时间,我们可以看到执行时间从之前的 274130.589 ms 降低到了 865.305 ms ,实现三百多倍的性能提升。当数据量进一步增大,或是查询涉及的表进一步增多时,聚集下推的性能提升会更加明显。

无聚集下推 VS 有聚集下推对比

PieCloudDB 的全新优化器「达奇」为用户提供了一系列全面的逻辑优化功能,包括谓词下推、子查询子连接提升和外连接消除等。作为一款面向在线分析处理(OLAP)场景的数据库,优化器「达奇」不仅支持聚集下推功能,还具备 Data Skipping、预计算等高级特性,以满足各种复杂查询的需求。在未来的文章中,我们将逐一介绍这些功能,为您带来更深入的了解。敬请关注!

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

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

相关文章

FSC147数据集格式解析

一. 引言 在研究很多深度学习框架的时候,往往需要使用到FSC147格式数据集,若要是想在自己的数据集上验证深度学习框架,就需要自己制作数据集以及相关标签,在论文Learning To Count Everything中,该数据集首次被提出。 …

基于微信小程序的中医体质辨识文体活动的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频: 基于微信小程序的中医体质辨识文体活动的设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java s…

如何进行在线pdf转ppt?在线pdf转ppt的方法

在当今数字化时代,PDF文件的广泛应用为我们的工作和学习带来了巨大的便利。然而,有时候我们可能需要将PDF转换为PPT文件,以便更好地展示和分享内容。在线PDF转PPT工具因其操作简便、高效而备受欢迎。如何进行在线pdf转ppt呢?接下来&#xff…

使用Jetpack Compose的镜像效果

使用Jetpack Compose的镜像效果 您是否曾想过在列表或一般情况下为图像创建镜像效果?有了强大的Jetpack Compose UI工具包,这变得简单而容易。 正如您所看到的,此效果包括以下内容 反转图像反转图像的50%可见性模糊的反转图像与…

openGauss学习笔记-46 openGauss 高级数据管理-子查询

文章目录 openGauss学习笔记-46 openGauss 高级数据管理-子查询46.1 SELECT语句中的子查询使用46.2 INSERT语句中的子查询使用46.3 UPDATE语句中的子查询使用46.4 DELETE语句中的子查询使用 openGauss学习笔记-46 openGauss 高级数据管理-子查询 子查询或称为内部查询&#xf…

实战演练 | Navicat 导出向导

数据库工具中的导入导出功能是指将数据从一个数据库系统导出到另一个数据库系统,或者将数据从一个文件格式导出到另一个文件格式。导入导出功能可以通过各种方式实现,例如使用SQL语句、数据库管理工具或第三方库和工具。在进行数据迁移时,通常…

AMBA总线协议(6)——AHB(四):传输细节

一、前言 在之前的文章中,我们已经讲述了AHB传输中的两种情况,基本传输和猝发传输。我们进行一个简单的回顾,首先,开始一次传输之前主机需要向仲裁器申请获得总线的使用权限,然后主机给出地址和控制信号,根…

冠达管理:沪指失守3100点 大盘加速赶底

8月21日,A股商场缩量跌落,上证指数尾盘失守3100点。券商股领跌,环保板块逆势掀涨停潮。北向资金净卖出64.12亿元,这是自8月7日以来连续第11个交易日净卖出。 从盘面看,早盘三大指数小幅低开,以券商股为主的…

前端找工作,有没有什么推荐的vue项目?

前言 可以参考一下下面的项目,已经作了vue2和vue3的分类,可以自己去选择适合的,希望对你有帮助~ Vue2 PC项目 1、 Elemen Star:53.4k 是一个基于Vue.js 2.0的UI组件库,由饿了么前端团队开发和维护。该组件库提供了…

文旅景区vr体验馆游乐场vr项目是什么

我们知道现在很多的景区或者游玩的地方,以及学校、科技馆、科普馆、商场或公园或街镇,都会建一些关于游玩以及科普学习的项目。从而增加学习氛围或者带动人流量等等。这样的形式,还是有很好的效果呈现。 普乐蛙VR体验馆案例 下面是普乐蛙做的…

wazuh初探系列一 : wazuh环境配置

目录 方法一:一体化部署 安装先决条件 第一步、安装所有必需的软件包 第二步、安装Elasticsearch 1、添加 Elastic Stack 存储库 安装 GPG 密钥: 添加存储库: 更新源: 2、Elasticsearch安装和配置 安装 Elasticsearch 包…

解决问题:C++ [某变量名] was not declared in this scope

目录 程序报错的问题 查看程序问题 发现错误代码 错误原因 修改代码 再次运行 程序报错的问题 查看程序问题 发现错误代码 cout<<c; 错误原因 c 这个变量还没有在这个程序中定义 修改代码 加上 int c; 再次运行

算法:二分查找算法/朴素二分/查找区间左右端点二分

文章目录 实现原理查找区间左右端点查找左端点查找右端点 实现思路朴素二分查找模板查找区间左右端点模板 典型例题二分查找查找元素第一个和最后一个位置x的平方根山脉数组峰顶索引 总结 实现原理 通常来说&#xff0c;二分查找的使用范围是当数组有序的时候可以使用&#xf…

2023年夏季《移动软件开发》实验报告2

2023年夏季《移动软件开发》实验报告 姓名和学号&#xff1f;本实验属于哪门课程&#xff1f;中国海洋大学23夏《移动软件开发》实验名称&#xff1f;实验2&#xff1a;天气查询小程序博客地址&#xff1f;XXXXXXXGithub仓库地址&#xff1f;XXXXXXX &#xff08;备注&#x…

MyBaits注解开发

1、注解开发介绍 在过去使用框架开发项目&#xff0c;基本都采用xml作为框架的核心配置文件存在&#xff0c;但是这种方式开发效率还是比较地下、不灵活。 现在企业开发为了能够更快的提高开发效率&#xff0c;必然会使用企业级框架进行项目开发&#xff0c;而现在主流的框架…

华人画家戴渭作品 3000 万拍出,牛津艺术学院发出任教邀请

爱丁堡,2023年7月 - 画家戴渭以他独特的画风、深邃的意境和慈悲智慧的属性,将艺术与宗教融合于作品之中。初看他的作品,可能会被其高超的艺术水准所震撼,然而仔细品味,方能领略到他深邃的艺术造诣与宗教智慧的深度融合。 作为国内最年轻的华人80后画家之一,戴渭近期被英国牛津…

若依cloud -【 22 ~ 25 】

22 认证中心介绍 1 概述 用户身份认证的过程ruoyi-cloud认证中心的实现没有依赖任何插件&#xff0c;相对简单&#xff0c;一看就懂从架构图的角度看认证中心&#xff1a; 登录请求&#xff0c;进到网关网关直接调用认证中心。查看ruoyi-gateway-dev.yml&#xff1a; # 结论…

【历史上的今天】8 月 22 日:改变世界的程序员们;网络直播的鼻祖;何小鹏离开阿里巴巴

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天 2023 年 8 月 22 日。历史上的今天&#xff0c;Masatoshi Shima 出生&#xff0c;他和 英特尔&#xff08;Intel&#xff09; 合作设计的芯片让第一个微处理器 Intel 400…

【SpringSecurity】二、密码处理与获取当前登录用户

文章目录 一、密码处理1、加密方案2、BCryptPasswordEncoder类初体验3、使用加密码加密 二、获取当前登录用户1、方式一&#xff1a;通过安全上下文的静态调用2、方式二&#xff1a;做为Controller中方法的参数3、方式三&#xff1a;从HTTPServletRequest中获取4、方式四&#…