无需业务改造,一套数据库满足 OLTP 和 OLAP,GaiaDB 发布并行查询能力

在企业中通常存在两类数据处理场景,一类是在线事务处理场景(OLTP),例如交易系统,另一类是在线分析处理场景(OLAP),例如业务报表。

OLTP 数据库擅长处理数据的增、删、改,以及小数据量的查询,更侧重数据的实时响应、高吞吐和事务性等要求。OLAP 则以大数据量的复杂查询为主,更侧重数据容量的扩展性、复杂计算能力等要求。

为了满足这两类业务场景,企业通常会采用 OLTP + OLAP 的组合方案或者分布式HTAP 数据库的产品方案。

  • 使用 OLTP + OLAP 的组合方案。他是采用分而治之的设计思路,不同的业务场景跑在各自擅长的数据库上,再通过 ETL 进行数据的异步同步。该方案能满足复杂的业务场景,但需要企业具有较强的 IT 能力。
  • 使用具备 HTAP 能力的分布式数据库。这类方案通过 zeroETL 屏蔽了 OLTP 和 OLAP 之间数据同步的复杂性,达到了简化业务架构效果,可以满足一些「重 TP 轻 AP」的场景。不过,这个方案涉及业务全面支持分布式改造。

图片

除了以上两种方案,是否有更加轻量化的解决方案,用一套数据库同时满足 TP(事务处理) 和 AP(复杂分析处理)业务呢?

很多企业用户由于找不到更加低成本、轻改造、易上手的解决方案,业务不得不勉强使用 TP 类型的数据库 MySQL 来承载 AP 业务。

GaiaDB 4.0 新增并行查询能力

大家最早认识云原生数据库 GaiaDB 是作为「MySQL Plus」的替代品,100% 兼容 MySQL,扩展性和性能又远超于开源 MySQL,所以 GaiaDB 在海量数据、高吞吐的场景,可以平滑替代 MySQL。

在 GaiaDB 4.0 之前,GaiaDB 像 MySQL 一样,无法很好支持复杂的分析处理需求,一条复杂的查询通常要处理几十秒甚至更长时间。

为了解决这个问题,GaiaDB  4.0 针对在线实时的分析业务发布了并行查询能力,使得业务在同一套集群上,无需任何改造即可满足复杂分析的需求。

众所周知,软件性能的提升一方面源于 CPU 硬件能力的增强,另一方面也得益于软件设计能够充分利用 CPU 的计算资源。

在 MySQL 的各个版本中,单个查询的执行通常是在一个独立的线程中完成,即对应一个 CPU 核。然而,在多核 CPU 下,仅依赖单个线程来执行查询无法充分利用硬件资源,特别是当涉及到 I/O 密集型操作或复杂查询时。

故 MySQL 在处理复杂查询时会有性能瓶颈,并且无法单纯通过提高资源配置解决这个问题。因此,简单的解决方案是充分利用 CPU 的多核计算资源,让多个核参与到计算任务中,这样才能大幅度提升查询计算的处理能力。

下图是 GaiaDB 利用多核资源并行计算一个表的 count(*) 过程的例子:表数据进行切块后,分发给多个 CPU 核进行并行计算,每个核计算部分数据得到一个中间 count(*) 结果,并在最后阶段将所有中间结果进行聚合得到最终结果。相比单线程处理的计算方式,GaiaDB 处理复杂查询任务的性能提升 1 到 2 个量级。

图片

技术实现思路

GaiaDB 并行查询技术的整体实现思想是对能够并行的查询算子(scan、gather等)进行并行化,在执行查询任务时将数据分片并启动若干个工作线程分别计算,最后将结果汇总返回给客户端。同时 GaiaDB 并行执行增加数据交互算子(stream),实现多个工作线程之间的数据交互,确保查询的正确性,完成整体的查询。

如下图,通过对算子进行线程拆分,将完整数据分区下推到不同的 worker 线程上,利用多个线程进行并行计算,并将结果汇总到 leader 线程上,leader 对返回的数据进行汇总处理并返回给用户。

图片

scan 算子并行化

在火山模型中,每个算子除了包括基础的构造函数外,都包含 Init 和  Read 函数,Init 函数做执行前的一些准备工作,Read 函数向下层算子发送命令并返回数据到上层算子。

Init 接口实现:并行扫描算子需要在扫描前将需要扫描的表提前切分成 partition,并放入 Ctx(execution context) 中。

并行扫描算子 Read接口设计:Read 接口中需要实现从 Ctx 中 dequeue 当前的 Ctx,并标记为 m_cur_ctx。根据 m_cur_ctx 中的 scan_ctx,拿到 execution context 信息,返回当前 m_cur_ctx 的第一个 record,并记录下一个 record 的位置,待下一次读取。m_cur_ctx 扫描完成后,从 m_ctxs 中取得下一个 ctx,重复读取以取完所有的数据。

ParallelTblScanIterator 与 TableScanIterator 的区别在于,并行扫描算子 ParallelTblScanIterator 将一个全表扫描任务划分成多个ctx 的子任务,便于多个线程协作,而 TableScanIterator 无法将任务拆分成多个子任务,导致无法并行执行。

scan 算子的示例说明,我们可以看到如下执行计划,表的整个扫描是串行进行的。

图片

当开启并行查询后,启动了多个 worker 线程进行并行执行,然后在 gather 阶段将每个线程查询的结果进行聚合并返回。

图片

gather 算子并行化

gather 算子是承上启下的算子,其主要功能是将上下文等执行相关信息传递给 worker 线程,同时将返回的数据经过处理后返回给 client。

gather 算子将原来执行 query 的单个线程,拆分成一对多的线程模型。gather 算子在 read 时创建新的线程,并拷贝执行所需要的所有变量,转由另外的线程执行,leader 线程在 message queue 中等待数据返回。ParallelWorkerArray 包括所有的 worker 信息,由 gather 算子维护清理。

gather 算子除了完成简单的数据转发功能外,还需要完成简单的计算。举例来说,假设每个 worker 线程的结果是 sum 函数结果,那么 gather 算子需要将各个 worker 线程的结果加起来。假设 query 最后需要排序,则 leader 线程需要将各个 worker 线程的结果重新排序后返回。

更多算子并行化

GaiaDB 支持多种类型的并行查询算子,以满足客户各种不同复杂查询场景。已经支持的并行查询算子包括:

  • 并行过滤(Filter)算子:where/having 等;
  • 并行扫描(Scan)算子:Projection 等;
  • 并行连接(Join)算子:HashJoin、NestLoopJoin、SemiJoin 等;
  • 并行聚合(Agg)算子:SUM/AVG/COUNT/BIT_AND/BIT_OR/BIT_XOR 等;
  • 并行排序(Sort)算子:order by;
  • 并行分组(group by)算子:group by;
  • 其他并行算子:limit(Limit/Offset),UNION 等。

GaiaDB 并行性能测试

下图是 GaiaDB 针对 TPC-H 查询场景的性能测试结果。与传统 MySQL 单线程相比,在 32 线程并行执行下,GaiaDB 单表复杂查询性能最高提升 14 倍,平均提升 8+ 倍。

测试环境:32 核,2 个 numa node,Intel(R) Xeon(R) Silver 4110 CPU @ 2.10 GHz,内存 128 GB,测试数据量 100 GB,并发线程数据 32。

图片

如图,32 核 CPU 利用率最高提升到 100%。

图片

开启 GaiaDB 并行查询

GaiaDB 提供 2 种启动并行查询的方法:

例如:采用默认的参数配置,同时指定并发度为 8:SELECT /*+ PQ(8) */ … FROM …

  1. 通过修改 GaiaDB 集群的全局参数开启并行查询能力。参数如下:
    • SET force_parallel_execute=ON 开启并行查询;

      parallel_default_dop=4 控制使用多少线程并行执行,默认并发度为 4;

      parallel_cost_threshold=1000 控制执行代价多大时,开启并行执行,默认是 1000;

  2. 通过使用 HINT 方式,在指定的 SQL 语句上开启并行查询能力。语法:SELECT /*+ PQ(并发度) */ … FROM …

另外一个提升复杂查询性能的方法

通过并行查询的方式,GaiaDB 将 CPU 资源和存储 I/O 充分利用起来,大幅提升复杂查询的处理性能。

除此之外,云原生数据库 GaiaDB  4.0 还推出了另外一个性能提升利器 — 列存索引技术,通过在数据表上为指定列创建列存索引,能够进一步加速查询性能。

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

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

相关文章

Elasticsearch 企业级实战 01:Painless 脚本如何调试?

在企业级应用中,Elasticsearch 常常被用来处理复杂的数据查询和操作。 Painless 是 Elasticsearch 的内置脚本语言,虽然强大,但调试起来并不容易。 本文将详细介绍如何在实战中有效调试 Painless 脚本,以提高开发和运维效率。 本文…

百日筑基第二十三天-23种设计模式-创建型总汇

百日筑基第二十三天-23种设计模式-创建型总汇 前言 设计模式可以说是对于七大设计原则的实现。 总体来说设计模式分为三大类: 创建型模式,共五种:单例模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式。结构型模式,共…

java基础之数组,int[]和ArrayList

开始学java的时候,对于 int[] 和ArrayList总是懵懵懂懂的,不知道啥时候用哪个。现在终于了解了,总结一下跟大家分享一下 int[]数组 创建// 方式一:创建一个固定的数组 int arr1 {1,2,3,4,5}; // 方式二:创建一个长度为10的数组 double[] ar…

28_EfficientNetV2网络详解

V1:https://blog.csdn.net/qq_51605551/article/details/140487051?spm1001.2014.3001.5502 1.1 简介 EfficientNetV2是Google研究人员Mingxing Tan和Quoc V. Le等人在2021年提出的一种深度学习模型,它是EfficientNet系列的最新迭代,旨在提…

HLS加密技术:保障流媒体内容安全的利器

随着网络视频内容的爆炸性增长,如何有效保护视频内容的版权和安全成为了一个亟待解决的问题。HLS(HTTP Live Streaming)加密技术作为一种先进的流媒体加密手段,凭借其高效性和安全性,在直播、点播等场景中得到了广泛应…

十大排序 之 选择排序

!!!排序仅针对于数组哦本次排序是按照升序来的哦 介绍 快速排序英文名为SelectSort从数组中找到最小的放到前边 基本思路 1、默认待排序数组中第一个作为最小值2、找待排序数组(注意不是整个数组哦)中真正的最小值3…

【机器学习实战】Datawhale夏令营2:深度学习回顾

#DataWhale夏令营 #ai夏令营 文章目录 1. 深度学习的定义1.1 深度学习&图神经网络1.2 机器学习和深度学习的关系 2. 深度学习的训练流程2.1 数学基础2.1.1 梯度下降法基本原理数学表达步骤学习率 α梯度下降的变体 2.1.2 神经网络与矩阵网络结构表示前向传播激活函数…

《昇思25天学习打卡营第22天|生成式-Diffusion扩散模型》

Diffusion扩散模型 本文基于Hugging Face:The Annotated Diffusion Model一文翻译迁移而来,同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件,执行Python文件时,请…

数据结构day2

一、思维导图 内存分配 二、课后习题 分文件编译 //sys.h #ifndef TEST_H #define TEST_H #define MAX_SIZE 100//定义学生类型 typedef struct Stu {char name[20]; //姓名int age; //年龄double score; //分数 }stu;//定义班级类型 typedef struct Class {struct …

Xilinx FPGA DDR4 接口配置基础(PG150)

1. 简介 本文为硬件平台创建PL IP模块,创建PL内核,子系统功能仿真,并评估Vivado的时序、资源和功耗收敛。 本文设计过程的主题包括: ClockingResetsProtocol DescriptionCustomizing and Generating the CoreExample Design D…

Linux学习(2):shell脚本和正则

概述 一般使用/bin/bash,也就是bash解析器。最广泛,大家公认。 一般shell脚本的后缀都是 .sh 简单写一个: 执行方法:sh sh文件 or bash sh文件,(不用x权限)直接运行./sh文件可能会有权限问题&#xff…

定制开发AI智能名片商城微信小程序在私域流量池构建中的应用与策略

摘要 在数字经济蓬勃发展的今天,私域流量已成为企业竞争的新战场。定制开发AI智能名片商城微信小程序,作为私域流量池构建的创新工具,正以其独特的优势助力企业实现用户资源的深度挖掘与高效转化。本文深入探讨了定制开发AI智能名片商城微信…

《昇思25天学习打卡营第20天|GAN图像生成》

生成对抗网络(GAN)是一种深度学习模型,用于生成逼真的图像。在手写数字识别的任务中,GAN 可以用来生成与真实手写数字相似的图像,以增强模型的训练数据集。GAN 主要由两个部分组成:生成器(Gener…

UDP客户端、服务端及简易聊天室实现 —— Java

UDP 协议(用户数据包协议) UDP 是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接,简单来说,当客户端向接收端发送数据时,客户端不会确认接收端是否存在,就会发出…

FATE Flow 源码解析 - 日志输出机制

背景介绍 在 之前的文章 中介绍了 FATE 的作业处理流程,在实际的使用过程中,为了查找执行中的异常,需要借助运行生成的日志,但是 FATE-Flow 包含的流程比较复杂,对应的日志也很多,而且分散在不同的文件中&…

Go语言中的并发

简单介绍go中的并发编程. 涉及内容主要为goroutine, goroutine间的通信(主要是channel), 并发控制(等待、退出). 想查看更多与Go相关的内容, 可以查看我的Go编程栏目 Goroutine 语法 在一个函数调用前加上go即可, go func(). 语法很简单, 可以说是并发写起来最简单的程序语言…

【简单介绍Gitea】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

广联达Linkworks ArchiveWebService XML实体注入漏洞复现

0x01 产品简介 广联达 LinkWorks(也称为 GlinkLink 或 GTP-LinkWorks)是广联达公司(Glodon)开发的一种BIM(建筑信息模型)协同平台。广联达是中国领先的数字建造技术提供商之一,专注于为建筑、工程和建筑设计行业提供数字化解决方案。 0x02 漏洞概述 广联达 LinkWorks…

【C#】已知有三个坐标点:P0、P1、P2,当满足P3和P4连成的一条直线 与 P0和P1连成一条直线平行且长度一致,该如何计算P3、P4?

问题描述 已知有三个坐标点:P0、P1、P2,当满足P3和P4连成的一条直线 与 P0和P1连成一条直线平行且长度一致,该如何计算P3、P4? 解决办法 思路一:斜率及点斜式方程 # 示例坐标 x0, y0 1, 1 # P0坐标 x1, y1 4, 4 # …

leetcode力扣_二分查找

69.x的平方根 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&…