一、概述

1. 案例介绍

在复杂查询场景中,单个查询的执行较长,系统并发度低,通过SMP并行执行技术实现算子级的并行,能够有效减少查询执行时间,提升查询性能及资源利用率。SMP并行技术的整体实现思想是对于能够并行的查询算子,将数据分片,启动若干个工作线程分别计算,最后将结果汇总,返回前端。SMP并行执行增加数据交互算子Stream,实现多个工作线程之间的数据交互,确保查询的正确性,完成整体的查询。

SMP特性通过算子并行来提升性能,同时会占用更多的系统资源,包括CPU、内存、I/O等等。本质上SMP是一种以资源换取时间的方式,在合适的场景以及资源充足的情况下,能够起到较好的性能提升效果;但是如果在不合适的场景下,或者资源不足的情况下,反而可能引起性能的劣化。SMP特性适用于分析类查询场景,这类场景的特点是单个查询时间较长,业务并发度低。通过SMP并行技术能够降低查询时延,提高系统吞吐性能。然而在事务类大并发业务场景下,由于单个查询本身的时延很短,使用多线程并行技术反而会增加查询时延,降低系统吞吐性能。

本案例选择OpenGaussDB的SMP并行执行特性作为示例,并借助开发者空间云主机提供的编译环境安装OpenGaussDB,实现SQL查询中,通过SMP并行执行特性提高SQL查询的性能。

通过实际操作,让大家深入了解如何利用SMP特性在日常的查询业务中优化性能。在这个过程中,大家将学习到OpenGaussDB关于SMP并行执行特性等关键步骤,从而掌握SMP的基本使用方法,体验其在应用开发中的优势。

2. 适用对象

  • 企业
  • 个人开发者
  • 高校学生

3. 案例时间

本案例总时长预计30分钟。

4. 案例流程

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_数据库

说明:

  1. 领取空间开发桌面,登录云主机;
  2. 在云主机终端进入OpenGaussDB;
  3. 进入开发者空间进行OpenGaussDB数据库之SMP特性功能使用。

5. 资源总览

资源名称

规格

单价(元)

时长(分钟)

云主机

ARM/鲲鹏 | 4 vCPUs 8GB | OpenEuler 22.03 Server定制版 (40GB)

免费

30

最新案例动态,请查阅《基于开发者空间OpenGauss数据库SMP并行技术的实现与应用》。小伙伴快来领取华为开发者空间,进入云开发环境桌面版实操吧!

二、开发者空间配置与使用

1. 开发者空间配置

面向广大开发者群体,华为开发者空间提供一个随时访问的“开发桌面云主机”、丰富的“预配置工具集合”和灵活使用的“场景化资源池”,开发者开箱即用,快速体验华为根技术和资源。

如果还没有领取开发者空间云主机,可以参考免费领取云主机文档领取。

领取云主机后可以直接进入华为开发者空间工作台界面,点击打开云主机 > 进入桌面连接云主机。

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_openGauss_02

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_openGauss_03

三、SMP并行执行

特性简介

openGauss的SMP并行技术是一种利用计算机多核CPU架构来实现多线程并行计算,以充分利用CPU资源来提高查询性能的技术。SMP并行技术充分利用了系统多核的能力,来提高重查询的性能。

1. 特性描述

在复杂查询场景中,单个查询的执行较长,系统并发度低,通过SMP并行执行技术实现算子级的并行,能够有效减少查询执行时间,提升查询性能及资源利用率。SMP并行技术的整体实现思想是对于能够并行的查询算子,将数据分片,启动若干个工作线程分别计算,最后将结果汇总,返回前端。SMP并行执行增加数据交互算子Stream,实现多个工作线程之间的数据交互,确保查询的正确性,完成整体的查询。

2. 特性增强

  • openGauss 6.0.0 新增支持如下场景的并行:
  1. cmd中声明的NO SCROLL游标和作为并行函数入参的游标表达式支持并行。
  2. 存在游标表达式入参的函数,如果创建时指定parallel_enable_clause,作为表函数执行支持并行。
  • openGauss 7.0.0-RC1 新增支持如下场景的并行:
  1. Astore批量IUD场景支持并行。

3. 特性约束

  • 索引扫描不支持并行执行。
  • MergeJoin不支持并行执行。
  • WindowAgg order by不支持并行执行。
  • 仅cmd中声明的NO SCROLL游标和作为并行函数入参的游标表达式支持并行,其他cursor不支持并行执行。
  • 存储过程和函数内的查询不支持并行执行。
  • 不支持子查询subplan和initplan的并行,以及包含子查询的算子的并行。
  • 查询语句中带有median操作的查询不支持并行执行。
  • 物化视图的更新不支持并行执行。
  • 会触发trigger的查询不支持并行执行,特别的,对包含外键的表执行INSERT/UPDATE/DELETE操作会触发trigger。
  • ustore引擎不支持并行执行。
  • 包含rownum的查询不支持并行执行。
  • 涉及拼接大于1G的LOB的语句不支持并行执行。

4. 配置SMP

4.1 SMP适用场景与限制

适用场景

  • 支持并行的算子:计划中存在以下算子支持并行。
  1. Scan:支持行存普通表和行存分区表顺序扫描 、列存普通表和列存分区表顺序扫描。
  2. Join:HashJoin、NestLoop
  3. Agg:HashAgg、SortAgg、PlainAgg、WindowAgg(只支持partition by,不支持order by)
  4. Stream:Local Redistribute、Local Broadcast
  5. 其他:Result、Subqueryscan、Unique、Material、Setop、Append、VectoRow、RowToVec
  • SMP特有算子:为了实现并行,新增了并行线程间的数据交换Stream算子供SMP特性使用。这些新增的算子可以看做Stream算子的子类。
  1. Local Gather:实现实例内部并行线程的数据汇总。
  2. Local Redistribute:在实例内部各线程之间,按照分布键进行数据重分布。
  3. Local Broadcast:将数据广播到实例内部的每个线程。
  4. Local RoundRobin:在实例内部各线程之间实现数据轮询分发。
  • 示例说明,以TPCH Q1的并行计划为例。

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_openGauss_04

在这个计划中,实现了Scan以及HashAgg算子的并行,并新增了Local Gather数据交换算子。其中3号算子为Local Gather算子,上面标有的“dop: 1/4”表明该算子的发送端线程的并行度为4,而接受端线程的并行度为1,即下层的4号HashAggregate算子按照4并行度执行,而上层的1~2号算子按照串行执行,3号算子实现了实例内并行线程的数据汇总。

通过计划Stream算子上表明的dop信息即可看出各个算子的并行情况。

非适用场景

  1. 索引扫描不支持并行执行。
  2. MergeJoin不支持并行执行。
  3. WindowAgg order by不支持并行执行。
  4. cursor不支持并行执行。
  5. 存储过程和函数内的查询不支持并行执行。
  6. 不支持子查询subplan和initplan的并行,以及包含子查询的算子的并行。
  7. 查询语句中带有median操作的查询不支持并行执行。
  8. 带全局临时表的查询不支持并行执行。
  9. 物化视图的更新不支持并行执行。

4.2 资源对SMP性能的影响

SMP架构是一种利用富余资源来换取时间的方案,计划并行之后必定会引起资源消耗的增加,包括CPU、内存、I/O等资源的消耗都会出现明显的增长,而且随着并行度的增大,资源消耗也随之增大。当上述资源成为瓶颈的情况下,SMP无法提升性能,反而可能导致集群整体性能的劣化。下面对各种资源对SMP性能的影响情况分别进行说明。

  • CPU资源

在一般客户场景中,系统CPU利用率不高的情况下,利用SMP并行架构能够更充分地利用系统CPU资源,提升系统性能。但当数据库服务器的CPU核数较少,CPU利用率已经比较高的情况下,如果打开SMP并行,不仅性能提升不明显,反而可能因为多线程间的资源竞争而导致性能劣化。

  • 内存资源

查询并行后会导致内存使用量的增长,但每个算子使用内存上限仍受到work_mem等参数的限制。假设work_mem为4GB,并行度为2,那么每个并行线程所分到的内存上限为2GB。在work_mem较小或者系统内存不充裕的情况下,使用SMP并行后,可能出现数据下盘,导致查询性能劣化的问题。

  • I/O资源

要实现并行扫描必定会增加I/O的资源消耗,因此只有在I/O资源充足的情况下,并行扫描才能够提高扫描性能。

4.3 其他因素对SMP性能的影响

除了资源因素外,还有一些因素也会对SMP并行性能造成影响。例如分区表中分区数据不均,以及系统并发度等因素。

  • 数据倾斜对SMP性能的影响

当数据中存在严重数据倾斜时,并行效果较差。例如某表join列上某个值的数据量远大于其他值,开启并行后,根据join列的值对该表数据做hash重分布,使得某个并行线程的数据量远多于其他线程,造成长尾问题,导致并行后效果差。

  • 系统并发度对SMP性能的影响

SMP特性会增加资源的使用,而在高并发场景下资源剩余较少。所以,如果在高并发场景下,开启SMP并行,会导致各查询之间严重的资源竞争问题。一旦出现了资源竞争的现象,无论是CPU、I/O、内存,都会导致整体性能的下降。因此在高并发场景下,开启SMP往往不能达到性能提升的效果,甚至可能引起性能劣化。

4.4 SMP使用建议

使用限制

想要利用SMP提升查询性能需要满足以下条件:

系统的CPU、内存、I/O和网络带宽等资源充足。SMP架构是一种利用富余资源来换取时间的方案,计划并行之后必定会引起资源消耗的增加,当上述资源成为瓶颈的情况下,SMP无法提升性能,反而可能导致性能的劣化。在出现资源瓶颈的情况下,建议关闭SMP。

配置步骤

  1. 观察当前系统负载情况,如果系统资源充足(资源利用率小于50%),执行2;否则退出。
  2. 设置query_dop = 1(默认值),利用explain打出执行计划,观察计划是否符合SMP适用场景与限制小节中的适用场景。如果符合,进入3。
  3. 设置query_dop=value,不考虑资源情况和计划特征,强制选取dop为1或value。
  4. 在符合条件的查询语句执行前设置合适的query_dop值,在语句执行结束后关闭query_dop。举例如下。

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_openGauss_05

说明:

  • 资源许可的情况下,并行度越高,性能提升效果越好。
  • SMP并行度支持会话级设置,推荐客户在执行符合要求的查询前,打开smp,执行结束后,关闭smp。以免在业务峰值时,对业务造成冲击。

四、SMP实践操作

1. 启动OpenGaussDB实例并登录

本案例中,使用OpenGaussDB开发平台,完成SQL的编程和自定义函数等多种功能。基于之前案例《基于开发者空间部署OpenGauss主备集中式数据库系统》。在云主机部署OpenGaussDB实例。并启动数据库服务。进入OpenGaussDB的安装目录的bin文件,该案例云主机环境中安装目录在环境变量$GAUSSHOME中,读者根据自己云主机安装目录进行操作修改。

cd $GAUSSHOME/bin

初始化数据库实例,初始化数据库目录在当前目录下data,设置节点名称和初始化用户密码。如下所示

./gs_initdb -D data --nodename=n1 -w GaussDB@123

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_openGauss_06

以单节点模式启动数据库实例,并在当前目录下输出日志文件logfile

./gs_ctl start -D data -Z single_node -l logfile

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_数据库_07

用gsql客户端工具,进入OpenGaussDB数据库。参数 -a表示追加、-r表示使用readline

./gsql -d postgres -ar

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_数据库_08

2. 测试SMP并行执行特性

下载supplier.csvsupplier.csv

wget https://dtse-mirrors.obs.cn-north-4.myhuaweicloud.com/case/0043/supplier.csv

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_数据库_09

创建表 supplier 结构

drop table if exists supplier;
create table supplier (s_suppkey integer not null,s_name char(25) not null,s_address varchar(40) not null,s_nationkey integer not null,s_phone char(15) not null,s_acctbal decimal(15,2) not null,s_comment varchar(101) not null);

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_华为开发者空间_10

执行如下SQL,把/home/developer/supplier.csv表数据写入表supplier中。

\copy supplier from '/home/developer/supplier.csv' with ( FORMAT 'csv', DELIMITER ',',  ENCODING 'utf8');

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_数据库_11

查询会话参数 query_dop, 默认是1。

show query_dop;

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_数据库_12

打开查询时间参数:

\timing

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_数据库_13

查看表supplier的结构:

\d supplier

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_数据库_14

执行SQL语句,分析执行时间:

select count(*) from supplier group by s_suppkey;

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_数据库_15

设置SMP并行查询的并发数量,由于云主机是4核CPU,所以设置query_dop = 4;

show query_dop;
set query_dop = 4;
show query_dop;

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_华为开发者空间_16

再次执行之前的select查询语句:

select count(*) from supplier group by s_suppkey;

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_openGauss_17

分析:

由于表SUPPLIER的数量量太小(10000条数据),但表结构简单,所以在开并行执行后,性能提升并不明显,当表数据量达到亿条数据级别,表结构与查询SQL复杂(比如嵌套子查询和join连接和聚合函数复合查询)。并且索引优化已经无法提升性能时,才会考虑最终的SMP并行执行优化方案。因为SMP并行执行特性会使索引功能失效。所以只有在索引和SQL优化提升性能不大的前提下,才会使用SMP通过硬件资源来优化提升SQL查询性能。

查看执行计划,可知测试SQL执行计划非常简单,该特性需要在复杂查询SQL中和大数据量表,才能体现中性能优势 。

基于开发者空间OpenGauss数据库SMP并行技术的实现与应用_华为开发者空间_18