本篇详细解释 PostgreSQL 中 max_parallel_workers_per_gathermax_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_workersmax_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. 表太小不值得并行

重要注意事项

  1. 层级关系max_parallel_workers_per_gathermax_parallel_workersmax_worker_processes

  2. 资源竞争:并行工作进程也用于并行索引创建、VACUUM等操作

  3. CPU核心数限制:并行度不应超过实际CPU核心数

  4. 内存考虑:每个并行进程都会消耗额外内存

  5. I/O考虑:过多并行进程可能导致I/O竞争

通过合理配置这两个参数,可以显著提升 PostgreSQL 在大数据量查询时的性能,同时避免过度并行导致的资源竞争问题。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐