PostgreSql 并行

一、概述

  当服务器有多核 cpu 时,PostgreSQL 会根据默认配置,在合适的条件下自动进行并行操作,除非主动关闭了相关并行参数。

二、并行相关参数

max_worker_processes:系统能够支持的后台进程的最大数量,默认是 8,并行工作者数据会受此参数限制。
max_parallel_workers:设置系统为并行操作所支持的工作者的最大数量,默认值为 8。
max_parallel_workers_per_gather:设置单个 Gather 或者 Gather Merge 节点能够开始的工作者的最大数量,默认值是 2,把这个值设置为 0 将会禁用并行查询执行。注意并行查询可能消耗比非并行查询更多的资源,因为每一个工作者进程时一个完全独立的进程,它对系统产生的影响大致和一个额外的用户会话相同。
max_parallel_maintenance_workers:维护性操作(建索引、除了 full 的 vacuum 操作)支持的最大并行数量,默认值是 2。
parallel_setup_cost:优化器启动并行进程的成本,默认为1000。
parallel_tuple_cost:优化器通过并行进程处理一行数据的成本,默认为0.1。
min_parallel_table_scan_size:扫描的数据量超过此值,优化器才会考虑启用并行,默认8M。
min_parallel_index_scan_size:扫描的索引数据量超过此值,优化器才会考虑启用并行,默认512k。
force_parallel_mode:强制使用并行查询,一般用于测试,默认off.

三、参数配置注意事项

  • 采用上述默认值,优化器会在并行查询成本低时,自动选择并行查询。
  • 自定义配置并行参数时,系统cpu数量 > max_worker_processes > max_parallel_workers > max_parallel_workers_per_gather > 0,max_parallel_workers_per_gather 为 0,禁用并行查询。
  • 想让表更容易走并行查询,可适当调低 min_parallel_table_scan_size,min_parallel_index_scan_size 值。

四、并行受限的场景

  • 单用户模式下,无法使用并行。
  • 公共表表达式(CTE)的扫描,无法使用并行。
  • 临时表的扫描,无法使用并行。
  • 外部表的扫描,无法使用并行,除非外部数据包装器有一个 IsForeignScanParallelSafe API。
  • 对 InitPlan 或 SubPlan 的访问无法使用并行。
  • 任何对数据进行修改或锁定行的查询,如 INSERT、UPDATE、DELETE 等,通常不支持并行执行。
  • DECLARE CURSOR 语句:该语句用于声明游标,用于在 PL/pgSQL 代码中检索查询结果。由于游标的作用是逐行读取数据,因此不支持并行执行。
  • 包含 PARALLEL UNSAFE 函数的查询:PARALLEL UNSAFE 函数是指那些在并行执行时可能导致数据不一致或错误的函数。包含这些函数的查询将无法并行执行。
  • 事务隔离级别为 SERIALIZABLE:当事务隔离级别设置为 SERIALIZABLE 时,要求事务串行执行,以避免并发问题。因此,在这种隔离级别下,查询无法并行执行。

你可能感兴趣的:(PostgreSql,学习笔记,postgresql,数据库)