详解PostgreSQL重要并行查询参数`max_parallel_workers_per_gather` 和 `max_parallel_workers`
摘要:PostgreSQL的并行查询性能由max_parallel_workers_per_gather和max_parallel_workers两个关键参数控制。前者限制单个查询节点的并行工作进程数(默认2),后者限制系统总并行进程数(通常≤8)。两者存在层级关系,需根据负载类型(OLTP/OLAP)合理配置:OLTP建议1-2个并行,OLAP可接近CPU核心数。配置时需考虑资源竞争、CPU核心
·
本篇详细解释 PostgreSQL 中 max_parallel_workers_per_gather
和 max_parallel_workers
这两个重要的并行查询参数。
参数关系图解
首先通过一个图表来理解这两个参数的关系:
系统资源池
┌─────────────────────────────────────┐
│ max_worker_processes (系统最大工作进程数) │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ max_parallel_workers (最大并行工作进程数) │ ← 并行查询可用的工作进程总数
└─────────────────────────────────────┘
│
├───────────────────┐
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ 单个Gather节点 │ │ 其他并行操作 │
│ max_parallel_workers_ │ │ (并行索引扫描、并行vacuum等)│
│ per_gather (默认2) │ │ │
└─────────────────────────┘ └─────────────────────────┘
1. max_parallel_workers_per_gather
定义
单个 Gather 或 Gather Merge 节点能够使用的最大并行工作进程数。
特性
- 作用范围:针对单个查询的单个并行执行节点
- 默认值:
2
- 动态调整:可以在会话级别实时修改
- 实际影响:决定并行查询的"并行度"
示例说明
-- 设置单个查询最多使用4个并行工作进程
SET max_parallel_workers_per_gather = 4;
-- 执行查询,将会使用最多4个并行进程
EXPLAIN ANALYZE SELECT * FROM large_table WHERE condition;
调整建议
- 增大:对于大型表扫描、复杂聚合操作,可提高性能
- 减小:对于OLTP负载,避免过多并行进程影响系统性能
- 设置为0:完全禁用并行查询
2. max_parallel_workers
定义
系统中同时可用的最大并行工作进程总数。
特性
- 作用范围:整个 PostgreSQL 实例
- 默认值:通常为
8
(取决于max_worker_processes
) - 限制关系:
max_parallel_workers
≤max_worker_processes
- 全局限制:控制所有并行操作的总进程数
示例说明
-- 查看当前设置
SELECT name, setting, unit FROM pg_settings
WHERE name IN ('max_worker_processes', 'max_parallel_workers');
-- 结果可能为:
-- max_worker_processes | 8 |
-- max_parallel_workers | 8 |
实际工作场景
场景1:默认配置下的并行查询
-- 系统设置:
-- max_worker_processes = 8
-- max_parallel_workers = 8
-- max_parallel_workers_per_gather = 2
-- 查询1:使用2个并行进程
SELECT * FROM table1 WHERE condition;
-- 查询2:同时使用2个并行进程
SELECT * FROM table2 WHERE condition;
-- 总共使用4个并行进程,系统还有4个可用
场景2:资源竞争情况
-- 如果同时运行4个查询,每个都需要3个并行进程
SET max_parallel_workers_per_gather = 3;
-- 但系统 max_parallel_workers = 8
-- 实际分配:3 + 3 + 2 = 8(最后一个查询只能获得2个进程)
配置建议
根据不同负载调整
负载类型 | max_parallel_workers_per_gather | max_parallel_workers | 说明 |
---|---|---|---|
OLTP | 1-2 | CPU核心数×0.5 | 避免并行影响事务性能 |
OLAP | CPU核心数-1 | CPU核心数×0.8 | 最大化并行查询性能 |
混合负载 | 2-4 | CPU核心数×0.6 | 平衡并行与串行性能 |
配置示例
-- 在 postgresql.conf 中设置
max_worker_processes = 16 -- 系统总工作进程
max_parallel_workers = 12 -- 并行工作进程总数
max_parallel_workers_per_gather = 4 -- 单个查询并行度
-- 会话级别临时调整
SET max_parallel_workers_per_gather = 6; -- 当前会话使用更高并行度
监控与诊断
查看并行查询状态
-- 查看正在运行的并行查询
SELECT pid, query, parallel_workers
FROM pg_stat_activity
WHERE parallel_workers > 0;
-- 查看并行查询统计信息
SELECT * FROM pg_stat_database;
诊断并行查询问题
-- 检查是否因为资源限制无法并行
EXPLAIN (ANALYZE, VERBOSE) SELECT * FROM large_table;
-- 如果看到"Workers Planned: 0",可能是:
-- 1. max_parallel_workers_per_gather = 0
-- 2. 没有足够的 max_parallel_workers
-- 3. 表太小不值得并行
重要注意事项
-
层级关系:
max_parallel_workers_per_gather
≤max_parallel_workers
≤max_worker_processes
-
资源竞争:并行工作进程也用于并行索引创建、VACUUM等操作
-
CPU核心数限制:并行度不应超过实际CPU核心数
-
内存考虑:每个并行进程都会消耗额外内存
-
I/O考虑:过多并行进程可能导致I/O竞争
通过合理配置这两个参数,可以显著提升 PostgreSQL 在大数据量查询时的性能,同时避免过度并行导致的资源竞争问题。
更多推荐
所有评论(0)