PostgreSQL 技术内幕(十二) CloudberryDB 并行化查询之路

随着数据驱动的应用日益增多,数据查询和分析的量级和时效性要求也在不断提升,对数据库的查询性能提出了更高的要求。为了满足这一需求,数据库引擎不断经历创新,其中并行执行引擎是性能提升的重要手段之一,逐渐成为数据库系统的标配特性。

Cloudberry Database(简称为“CBDB”或“CloudberryDB”)是面向分析和AI场景打造的下一代统一型开源数据库,搭载了PostgreSQL 14.4内核,采用Apache License 2.0许可协议。CBDB在Postgres的基础之上,对已有的并行执行计划进行了大量的调整和优化,实现了显著的性能提升。

在这次的直播中,HashData数据库内核研发专家介绍了Postgres的并行化原理,CBDB在并行化上的优化与改进、功能特性及实践演示。以下内容根据直播文字整理。

并行化查询介绍

PostgreSQL在很多场景下会启用并行执行计划,创建多个并行工作子进程,提升查询效率。PostgreSQL的并行化包含三个重要组件:进程本身(leader进程)、gather、workers。没有开启并行化的时候,进程自身处理所有的数据;一旦计划器决定某个查询或查询中某个部分可以使用并行的时候,就会在查询的并行化部分添加一个gather节点,将gather节点作为子查询树的根节点。

HashData研发团队在对CloudberryDB实现并行化查询时,主要对查询执行算子、Join的实现以及存储引擎并行化扫描等进行了调整和优化。

图1:非并行化查询与并行并查询对比示例

如图1所示,以3个节点的集群为例,在不开启并行化进行Not in操作时,需要耗时50多秒;而在CBDB中开启并行化查询后,用时仅需119毫秒,效率大约提升600倍。

在开启并行化查询时,有以下几处变化:

  • Gather Motion从3:1提升至12:1,意味着集群的每个节点上有4个进程在同时并行工作;
  • Hash节点变为Parallel Hash;
  • 新算子Broadcast Workers Motion 广播每一份数据到一组并行工作的进程中的一个,避免在共享Hash表的情况下出现数据重复。
  • 底层的扫描由Seq Scan变为Parallel Seq Scan。

并行扫描原理

在PostgreSQL中,数据以Heap表的形式存储。在读取时,通常有顺序扫描(Seq Scan)、索引扫描(Index Scan)和位图扫描(Bitmap scan)三种扫描方式。接下来,我们对以上三种扫描方式的并行化进行介绍。

图2:PostgreSQL Heap表并行顺序扫描示意图

如图2所示,在并行顺序扫描时,两个子进程的快照是统一共享的。进程之间通过原子操作动态获得每次要读取的Page范围,避免频繁使用锁从而造成瓶颈。Page的范围并不固定,会根据数据量和读取进度进行动态调整,使得任务尽量均分在不同进程中,避免木桶效应。

图3:PostgreSQL 并行索引扫描示意图

使用索引扫描并行化查询时,子进程只需要读取对应索引的Page,每个进程每次只读取一个索引Page,再读取Heap表数据;如果Page为全体可见,可以不读取Heap表。

图4:PostgreSQL 并行位图扫描示意图

并行位图扫描在建立底层索引的Page范围时,只有一个进程,按照索引信息(CTID)进行顺序扫描。与PostgreSQL使用leader进程不同的是,CBDB在并行化查询时,会通过竞争的方式选择一个X进程,X进程负责建立位图,之后多个workers竞争读取数据。

图5:CloudberryDB AO表并行化查询示意图

除了Heap表之外,CBDB还引入了AO表,用来专门存储以追加方式插入的元组。如图5所示,AO表的并行扫描是通过原子操作获取Segfiles,让各个进程通过竞争的方式读取数据。

并行Join实现

并行能力的优化需要从多方面来实现,仅凭优化扫描方式能实现的性能提升有限,Join的并行化改造是另一个重要方向。

在PG中有三种Join,分别为Nestloop Join、Merge Join和Hash Join,CBDB对上述三种Join均实现了并行化。此外,一大特色是增加了共享内表的Hash Join(Parallel-aware Hash Join)。

Parallel-aware Hash Join与Hash Join相似,区别在于前者是可以共享的,进程之间相互协作共同建立共享的Hash内表。

图6:Build a Join并行化实现流程示意图

如图6所示,在PG非并行的情况下,构建Join时从目标对象(Table A、Table B)各选取一条综合代价最低的执行路径,合成Join relations路径。在开启并行化后,会在上述情况下增加一条并行化最佳路径,与非并行化路径构建Join。

数据分布并行化

在Greenplum 中,数据分布有Partitioned、Replicated、Bottleneck三种情况,它们之间可以通过Motion改变Locus的属性进行互相转化,实现数据重分布,CBDB也沿用了这一特性。

图7:CBDB数据分布特性示意图

在CBDB构建Join的时候,可以通过改变Locus进行数据相容。在转化过程中遵循两个原则:

  1. 在Join时,要保证数据不重复、不丢失;
  2. 要选择代价最小的方式。

与Greenplum 不同的是,CBDB在开启并行化之后,新建了三个新的Locus 并行模式,实现不同的数据分布:HashedWorkers、SegmentGeneralWorkers和ReplicatedWorkers。 HashedWorkers Locus表示数据分布在同一组进程之间是随机的,但是合并后数据分布变成Hashed Locus。同理,SegmentGeneralWorkers 和ReplicatedWorkers也代表了数据在进程间随机,合并后满足各自的分布状态。

此外,CBDB还实现了并行刷新物化视图、并行Create Table AS、多阶段并行化Aggregation/Limit等。通过以上诸多并行优化措施后,CBDB性能得到大幅度的提升,在特定场景下甚至可以实现千百倍的查询效率提升,支持企业海量数据的复杂分析需求。

图8:CBDB并行化性能曲线图

并行化查询是CBDB在研发立项之初就确定的产品方向,我们希望能够通过多线程并行执行来充分释放现代多核大内存的硬件能力,降低包括IO以及CPU计算在内的处理时间,实现响应时间的大幅下降,更好地提升用户使用体验和业务敏捷度。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

openGauss学习笔记-147 openGauss 数据库运维-备份与恢复-逻辑备份与恢复之gs_dump

文章目录 openGauss学习笔记-147 openGauss 数据库运维-备份与恢复-逻辑备份与恢复之gs_dump147.1 背景信息147.2 注意事项147.3 语法147.4 参数说明147.4.1 通用参数:147.4.2 转储参数:147.4.3 连接参数: 147.5 说明147.6 示例 openGauss学习…

List的元素覆盖问题

问题场景 在备课底层JDBC链接链接数据库时,将读取的数据封装到对象中并添加到list集合中出现了问题。 错误逻辑 代码编写的考量为减少对象占用内存。想通过一个对象完成数据的传递和保存。 核心问题 List集合存储的是每一个对象的引用地址,如果引用的…

如何选择合适水下应用的集成电缆传感器?

来源:宏集科技 工业物联网丨宏集干货 | 如何选择合适水下应用的集成电缆传感器? 原文链接:https://mp.weixin.qq.com/s/wbN40niOgpUHy1iSH9Ad3Q 欢迎关注虹科,为您提供最新资讯! 前言 许多工业过程都要求将传感器浸…

如何使用技术 SEO 优化 Pinterest 富图钉

Pinterest 可以影响搜索引擎排名,尤其是谷歌。不过,它的作用方式与其他搜索引擎优化因素不同。这就是 Google 将图钉放在 nofollow 列表中。但是,它们仍然可以作为搜索引擎优化的一个重要因素。 高质量的图钉具有高分辨率的图片、吸引人的内…

mybatis入门

Java的三大框架:Spring,SpringMVC,MyBatis 框架其实就是对通用代码的封装,提前写好了一堆接口和类,我们可以在做项目的时候直接引入这些接口和类,基于这些现有的接口和类进行开发,可以大大提高开发效率 J…

【网络编程】-- 01 概述、IP

网络编程 1 概述 1.1 计算机网络 (连接分散计算机设备以实现信息传递的系统) 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下&…

SmartChart:一站式数据可视化解决方案

在当今的数据驱动的世界中,数据可视化已经成为了一个重要的工具,它可以帮助我们理解复杂的数据集,并从中提取有价值的信息。SmartChart就是这样一个强大的数据可视化工具,它提供了一站式的数据可视化解决方案,无论你是…

(十五)Flask覆写wsgi_app函数实现自定义中间件

中间件 一、剖析: 在前面讲session部分提到过:请求一进来,Flask会自动调用应用程序对象【Flask(__name__)】的__call__方法,这个方法负责处理请求并返回响应(其实如下图:其内部就是wsgi_app方法&#xff…

【重磅来袭!!!工程师必备初始化建工程软件】

重磅来袭!!!工程师必备初始化软件 每个工程建立前,你是否为了要建立各种文件夹而烦恼?你是否为了因为工程每次文件夹不统一找不到文件而烦扰?来咯,Project Initial V1_0软件只需输入工程名称&am…

安装you-get(mac)

1、首先要有python环境 2、更新pip python -m pip install --upgrade pip 3、安装you-get pip install you-get;

keep-alive 是 Vue 的一个内置组件,用于缓存其他组件的实例,以避免重复渲染和销毁,它可以在需要频繁切换的组件之间提供性能优化

目录 keep-alive 使用 keep-alive 的示例代码: 手动清除组件缓存的示例代码: keep-alive 组件有以下几个优点: keep-alive 的原理: 使用 keep-alive 组件,你可以包裹需要缓存的组件,然后这些组件在切…

基于ssm安徽新华学院实验中心管理系统论文

摘 要 本安徽新华学院实验中心管理系统的设计目标是实现安徽新华学院实验中心的信息化管理,提高管理效率,使得安徽新华学院实验中心管理工作规范化、科学化、高效化。 本文重点阐述了安徽新华学院实验中心管理系统的开发过程,以实际运用为开…

Pytest+Allure生成自动化测试报告!

前言 在自动化测试中,有unittestHTMLTestRunner自动化测试报告,但是生成的测试报告不够美观详细,今天我们来学习一下PytestAllure生成自动化测试报告。 一:安装python中的allure依赖库 在dos窗口中,输入下面三个命令…

AntDesignBlazor示例——创建查询条件

本示例是AntDesign Blazor的入门示例,在学习的同时分享出来,以供新手参考。 示例代码仓库:https://gitee.com/known/AntDesignDemo 1. 学习目标 重构项目文件结构添加日期查询条件实现查询业务逻辑 2. 重构项目结构 在实现列表查询条件功…

【PCB设计】嘉立创EDA器件3D模型导入AD的方法

嘉立创EDA器件3D模型导入AD的方法 一、嘉立创EDA导出3D模型二、CAD编辑3D模型三、AD中加载3D模型 一、嘉立创EDA导出3D模型 在嘉立创EDA中找到对应的元器件,并生成PCB,选择导出3D文件 导出元件step模型 二、CAD编辑3D模型 用FreeCAD打开模型 删除…

JAVA全栈开发 MySql详解

一、数据库 1.数据储存在哪里? 硬盘、网盘、U盘、光盘、内存(临时存储) 数据持久化 使用文件来进行存储,数据库也是一种文件,像excel ,xml 这些都可以进行数据的存储,但大量数据操作&#x…

学习设计模式的一个好网址

常用设计模式有哪些? (refactoringguru.cn)https://refactoringguru.cn/design-patterns

elasticsearch-head 启动教程

D:\elasticsearch-head-master>grunt server ‘grunt’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 npm install -g grunt-clinpm install

经历需求放缓,裁员1.7万人后,亚马逊股票还值得投资吗?

来源:猛兽财经 作者:猛兽财经 亚马逊再次实现增长 尽管在疫情期间,很多电子商务公司都发展的很迅猛,但根据Statista的数据,亚马逊(AMZN)依然保持着对竞争对手的碾压,亚马逊目前约占美国电子商务市场总份额…

全志XR806蓝牙透传(单向)测试

评测三 蓝牙透传(单向) 有时无线透传在无法布线时有很方便的效用,不妨试试蓝牙透传,效果如下: 具体是无线数据->串口数据,串口数据->无线数据,目前前者实现了,后者还有些问题未解决, 实现…