openGauss并行查询测试(二)

简介: openGauss并行查询测试

6. 其他因素对SMP性能的影响

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

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

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

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

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

7. SMP 使用建议

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

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

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

说明:

资源许可的情况下,并行度越高,性能提升效果越好。

SMP并行度支持会话级设置,推荐客户在执行符合要求的查询前,打开smp,执行结束后,关闭smp。以免在业务峰值时,对业务造成冲击。

5. query_dop

  • 参数说明: 用户自定义的查询并行度。
  • 该参数属于USERSET类型参数,请参考表GUC参数分类中对应设置方法进行设置。
  • 取值范围: 整型,1~64。打开固定SMP功能,系统会使用固定并行度。

说明: 在开启并行查询后,请保证系统CPU、内存、网络等资源充足,以达到最佳效果。

  • 默认值: 1

三、测试

1. 构建测试数据

[omm@node1 ~]$ gsql -d postgres -p26000 -r
gsql ((openGauss 3.1.0 build 2c0ccaf9) compiled at 2022-09-25 19:32:58 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
openGauss=# create table test (id int,en varchar(200));
CREATE TABLE
Time: 9.511 ms
openGauss=# insert into test values(generate_series(1,10000000),md5(random()::text));
INSERT 0 10000000
Time: 25792.555 ms
openGauss=# \d+
                                    List of relations
 Schema | Name | Type  | Owner |  Size  |             Storage              | Description
--------+------+-------+-------+--------+----------------------------------+-------------
 public | test | table | omm   | 657 MB | {orientation=row,compression=no} |
(1 row)

2. CPU为16c时

  • query_dop=1
openGauss=# \timing
Timing is on.
openGauss=# set query_dop=1;
SET
Time: 0.322 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 1603.324 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 673.562 ms
  • query_dop=4
openGauss=# set query_dop=4;
SET
Time: 0.306 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 210.510 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 217.283 ms
  • query_dop=8
openGauss=# set query_dop=8;
SET
Time: 0.258 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 165.018 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 157.060 ms
  • query_dop=16
openGauss=# set query_dop=16;
SET
Time: 0.274 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 173.323 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 163.022 ms

3. CPU为8c

  • query_dop=1
openGauss=# set query_dop=1;
SET
Time: 0.242 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 3426.668 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 990.474 ms
  • query_dop=4
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 349.525 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 381.206 ms
  • query_dop=8
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 283.316 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 277.508 ms

query_dop=16

openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 189.836 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 188.878 ms

4. CPU为4c

  • query_dop=1
openGauss=# \timing
Timing is on.
openGauss=# set query_dop=1;
SET
Time: 0.314 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 3119.898 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 972.142 ms
  • query_dop=4
openGauss=# set query_dop=4;
SET
Time: 0.267 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 380.970 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 337.972 ms
  • query_dop=8
openGauss=# set query_dop=8;
SET
Time: 0.297 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 258.877 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 266.643 ms
  • query_dop=16
openGauss=# set query_dop=16;
SET
Time: 0.306 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 224.949 ms
openGauss=# select * from test where id=999;
 id  |                en
-----+----------------------------------
 999 | 4b9d69053e3de0ed30e1b9e3283f7270
(1 row)
Time: 216.097 ms

汇总

并行度 16c SQL执行时间 8c SQL 执行时间 4c SQL执行时间
query_dop=1 660 ms 990 ms 972 ms
query_dop=4 215 ms 349 ms 380 ms
query_dop=8 165 ms 277 ms 258 ms
query_dop=16 166 ms 188 ms 224 ms
query_dop=32 200 ms 243 ms 305 ms
query_dop=64 325 ms 387 ms 440 ms
目录
相关文章
|
17天前
|
Web App开发 数据库 索引
Playwright 测试并行性
Playwright 测试并行性
18 0
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
41 4
|
1月前
|
SQL
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
35 2
|
3月前
|
测试技术 API 开发者
Python 魔法:打造你的第一个天气查询小工具自动化测试框架的构建与实践
【8月更文挑战第31天】在这篇文章中,我们将一起踏上编程的奇妙旅程。想象一下,只需几行代码,就能让计算机告诉你明天是否要带伞。是的,你没有听错,我们将用Python这把钥匙,解锁天气预报的秘密。不论你是编程新手还是想拓展技能的老手,这篇文章都会为你带来新的视角和灵感。所以,拿起你的键盘,让我们一起创造属于自己的天气小工具吧!
|
3月前
|
JavaScript 前端开发 应用服务中间件
【qkl】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
|
6月前
|
测试技术
Appium 并行测试多个设备
Appium 并行测试多个设备
158 0
|
自然语言处理 搜索推荐 Java
【网安AIGC专题10.25】9 LIBRO方法(ICSE2023顶会自动化测试生成):提示工程+查询LLM+选择、排序、后处理(测试用例函数放入对应测试类中,并解决执行该测试用例所需的依赖)
【网安AIGC专题10.25】9 LIBRO方法(ICSE2023顶会自动化测试生成):提示工程+查询LLM+选择、排序、后处理(测试用例函数放入对应测试类中,并解决执行该测试用例所需的依赖)
266 0
|
关系型数据库 MySQL 测试技术
软件测试|MySQL BETWEEN AND:范围查询详解
软件测试|MySQL BETWEEN AND:范围查询详解
|
9天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
39 3
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
59 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)