并行查询是数据库处理大规模数据集的关键性能优化技术。本文详细介绍达梦数据库的并行设置方法、查看并行执行情况及实际应用案例,帮助您充分利用多核处理能力提升查询性能。

1. 并行查询参数配置

达梦数据库的并行查询主要通过以下几个关键参数控制:

1.1 PARALLEL_POLICY - 并行策略设置

-- 查看当前并行策略设置
SELECT para_name, para_value, para_type 
FROM v$dm_ini 
WHERE para_name = 'PARALLEL_POLICY';

参数值含义:

0: 不支持并行(默认值)
1: 自动并行模式
2: 手动并行模式

1.2 PARALLEL_THRD_NUM - 并行线程数

当开启本地并行(PARALLEL_POLICY>0)时,使用PARALLEL_THRD_NUM指定本地并行查询使用的线程数,取值范围为1~1024,默认值为10。

需要注意的是,若PARALLEL_POLICY=1,且PARALLEL_THRD_NUM=1,则系统会根据CPU核心数自动设置并行线程数。

1.3 MAX_PARALLEL_DEGREE - 最大并行度

使用自动并行模式时,需要设置MAX_PARALLEL_DEGREE参数,同时确保PARALLEL_POLICY=1。不过从实际应用经验来看,一般建议避免使用自动并行,手工设置并行更适合大多数场景。

2. 查看当前并行相关配置

SELECT para_name, para_value, para_type 
FROM v$dm_ini 
WHERE para_name LIKE '%PARA%';

执行结果:

行号     PARA_NAME                      PARA_VALUE PARA_TYPE
---------- ------------------------------ ---------- ---------
1          BATCH_PARAM_OPT                0          IN FILE
2          CLT_CONST_TO_PARAM             0          IN FILE
3          HAGR_PARALLEL_OPT_FLAG         0          SESSION
4          MAX_PARALLEL_DEGREE            1          SESSION
5          PARALLEL_POLICY                0          IN FILE
6          PARALLEL_THRD_NUM              10         IN FILE
7          PARALLEL_MODE_COMMON_DEGREE    1          SESSION
8          HFINS_PARALLEL_FLAG            0          SYS
9          SEC_INDEX_PARALLEL_INSERT_FLAG 0          SYS
10         RLOG_PARALLEL_ENABLE           0          IN FILE
11         PARALLEL_PURGE_FLAG            0          IN FILE
12         AP_PARALLEL_DEGREE             10         IN FILE

3. 修改并行配置方法

3.1 通过dm.ini文件修改(实例级)

编辑达梦数据库配置文件dm.ini,设置PARALLEL_POLICY参数值:

PARALLEL_POLICY = 2 # 设置为手动并行模式
PARALLEL_THRD_NUM = 10 # 设置并行线程数为10
修改完成后需要重启数据库服务使配置生效:

dm.ini配置修改

3.2 会话级修改

– 修改当前会话的并行策略为手动模式
SET PARALLEL_POLICY = 2;

– 设置当前会话的并行线程数
SET PARALLEL_THRD_NUM = 8;

4. 使用并行查询与执行计划分析

4.1 通过SQL HINT指定并行度

– 使用PARALLEL提示指定并行度为4
SELECT /*+ PARALLEL(4) / DEPARTMENT_ID, COUNT()
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;

4.2 比较执行计划

带并行的执行计划:

SQL> EXPLAIN SELECT /*+PARALLEL(4)*/ DEPARTMENT_ID, COUNT(*) FROM EMPLOYEES GROUP BY DEPARTMENT_ID;

1   #NSET2: [1, 1, 30] 
2     #PRJT2: [1, 1, 30]; exp_num(2), is_atom(FALSE) 
3       #HAGR2: [1, 1, 30]; grp_num(1), sfun_num(1); 
4       #LOCAL COLLECT: [1, 1, 30]; op_id(1) n_grp_by (0) n_cols(0) n_keys(0) for_sync(FALSE)
5           #HAGR2: [1, 1, 30]; grp_num(1), sfun_num(1); 
6             #CSCN2: [0, 3, 30]; INDEX33555497(EMPLOYEES)

不带并行的执行计划:

SQL> EXPLAIN SELECT DEPARTMENT_ID, COUNT(*) FROM EMPLOYEES GROUP BY DEPARTMENT_ID;

1   #NSET2: [1, 1, 30] 
2     #PRJT2: [1, 1, 30]; exp_num(2), is_atom(FALSE) 
3       #HAGR2: [1, 1, 30]; grp_num(1), sfun_num(1); 
4         #CSCN2: [0, 3, 30]; INDEX33555497(EMPLOYEES)

执行计划分析:观察带并行的执行计划中出现了#LOCAL COLLECT操作符,这是并行执行的明显标志。此操作符负责协调各并行线程并收集结果,是达梦数据库并行处理机制的核心组件。

5. 并行查询适用场景

5.1 适合并行的查询类型

大表全表扫描:对包含百万级以上记录的表执行全表扫描
复杂聚合操作:包含GROUP BY、聚合函数的复杂查询
多表连接:涉及多个大表的复杂连接操作
大量数据排序:需要对大量数据进行ORDER BY操作

5.2 不适合并行的查询类型

小表查询:数据量小于10万行的表通常不需要并行
高选择性索引查询:通过高效索引只访问少量数据的查询
OLTP事务处理:频繁的小批量事务操作
单行查询:通过主键或唯一索引获取单行数据

6. 并行度设置与性能优化

6.1 并行度设置原则

小型服务器(4核以下):并行度 = CPU核心数
中型服务器(4-16核):并行度 = CPU核心数 × 0.75
大型服务器(16核以上):并行度 = CPU核心数 × 0.5

6.2 性能优化实例

聚合查询示例(500万行数据表):

-- 不使用并行:执行时间15秒
SELECT region, product_category, SUM(sales_amount) 
FROM sales_data 
GROUP BY region, product_category;

-- 使用并行:执行时间2.5秒
SELECT /*+ PARALLEL(8) */ region, product_category, SUM(sales_amount) 
FROM sales_data 
GROUP BY region, product_category;

性能提升:6倍

6.3 最佳实践

选择适当的并行模式:手动并行模式(PARALLEL_POLICY=2)通常比自动并行更可控
合理设置并行度:根据系统资源和查询特性设置合适的并行度
适用场景识别:针对适合并行的查询类型有选择地应用并行技术
结合其他优化技术:并行查询与表分区、索引优化等技术结合使用效果更佳
常见问题排查:当并行设置未生效时,检查PARALLEL_POLICY参数设置和执行计划
达梦数据库的并行查询功能是提升大数据量处理性能的有力工具。通过合理配置并行参数和正确使用并行语法,可以充分发挥多核硬件优势,显著提升查询执行效率。

公众号:收获不止数据库

系列回顾
“大白话人工智能” 系列
“数据库拍案惊奇” 系列
“世事洞明皆学问” 系列

Logo

一站式 AI 云服务平台

更多推荐