CONFIGURATION PARAMETER查询规划 / 规划器方法配置
enable_partitionwise_join
允许按匹配分区执行连接。
Enables partitionwise join.
布尔 会话 引入 11 现存至 20 devel 0 次默认值变更
- 类型
- 布尔bool
- 上下文
- 会话任何用户都可在会话内用 SET 修改
- 默认值
off- 引入版本
- 11
- 状态
- 现存
版本轨迹
相对 PostgreSQL 17 无变化。
默认值变迁
默认值自 PostgreSQL 11 起没有变过。带单位的取值换算成了可读形式,原始的 boot_val 与单位写在悬浮提示里。
手册说明
本版译文与 PostgreSQL 14 完全一致,下面就是同一段文字。
允许或者禁止查询规划器使用面向分区的连接,这使得分区表之间的连接以连接匹配的分区的方式来执行。 面向分区的连接当前只适用于连接条件包括所有分区键的情况,连接条件必须是相同的数据类型并且子分区集合要1对1匹配。 由于面向分区的连接规划在规划期间会使用可观的CPU时间和内存,所以默认值为off。
机制详解
enable_partitionwise_join 控制规划器是否可以选择当连接键包含兼容分区键时,对一一匹配的分区分别执行连接。
该值在生成计划时读取。会话级修改适合比较不同 EXPLAIN 方案,但不会追溯改写已缓存计划;必须触发失效或重新规划才能观察到不同选择。
参与分区增多时,它可能近似线性地增加受 work_mem 限制的节点和规划成本。其 user 上下文允许按会话或事务局部修改,之后执行或重新规划的工作会读取新值。
调优建议
按典型负载给出的取值思路,不是放之四海皆准的配方:实际取值要看数据量、并发度与硬件。
-
OLTP在线事务处理
常规 OLTP 保持上游默认 off。只有两侧是一一兼容分区布局且连接包含全部分区键时,才在会话范围测试 on;同时预算每分区产生的规划 CPU 与受 work_mem 限制节点。
-
OLAP分析与批处理
应比较规划内存、规划时间、总执行内存与分区数,不能只看执行时间。
-
小规格低配实例与开发机
除非特定分区对齐连接反复获益,否则保持 off。分区很多时,即使每个局部连接高效,规划与每节点内存也可能在小主机上失衡。
常见问题
- 把 enable_partitionwise_join 当成单条查询 hint,却忽略它会影响作用域内生成的所有计划。
- 用已经缓存的预备计划测试,然后误判该参数没有效果。
- 通过全局禁用计划方法来掩盖统计信息陈旧或基数估算错误。
- 参与分区增多时,它可能近似线性地增加受 work_mem 限制的节点和规划成本。
演化历史
相邻两个大版本之间的差异,新的在前。版本号链到该版的快照。
-
PostgreSQL 20 ← 19 沿用 19
事实沿用 19
-
PostgreSQL 11 ← 10 新增此参数
PostgreSQL 11 起可用
逐版本快照
每个收录版本里的 7 项事实,与上一个存在的版本不同的格子带底色。版本号链到该版。
参考资料
同类参数
| 参数 | 类型 | 上下文 | 默认值 | 版本变动 | 最近变更 |
|---|---|---|---|---|---|
| 规划器方法配置 26 | |||||
enable_async_append |
布尔 | 会话 | on |
— | |
| 允许规划器使用异步 Append 计划。 | 现存 | ||||
enable_bitmapscan |
布尔 | 会话 | on |
— | |
| 允许规划器使用位图扫描计划。 | 现存 | ||||
enable_distinct_reordering |
布尔 | 会话 | on |
— | |
| 允许规划器重排 DISTINCT 键。 | 现存 | ||||
enable_eager_aggregate |
布尔 | 会话 | on |
— | |
| 允许规划器把部分聚合提前推过连接。 | 现存 | ||||
enable_gathermerge |
布尔 | 会话 | on |
— | |
| 允许规划器使用 Gather Merge 计划。 | 现存 | ||||
enable_group_by_reordering |
布尔 | 会话 | on |
— | |
| 允许规划器重排 GROUP BY 键。 | 现存 | ||||
enable_groupagg |
布尔 | — | — | ||
| 启用或禁用查询规划器使用基于排序的分组和聚合计划类型。 | 现存 | ||||
enable_hashagg |
布尔 | 会话 | on |
— | |
| 允许规划器使用哈希聚合计划。 | 现存 | ||||
enable_hashjoin |
布尔 | 会话 | on |
— | |
| 允许规划器使用哈希连接计划。 | 现存 | ||||
enable_incremental_sort |
布尔 | 会话 | on |
— | |
| 允许规划器使用增量排序步骤。 | 现存 | ||||
enable_indexonlyscan |
布尔 | 会话 | on |
— | |
| 允许规划器使用仅索引扫描计划。 | 现存 | ||||
enable_indexscan |
布尔 | 会话 | on |
— | |
| 允许规划器使用索引扫描计划。 | 现存 | ||||
enable_material |
布尔 | 会话 | on |
— | |
| 允许规划器插入物化节点。 | 现存 | ||||
enable_memoize |
布尔 | 会话 | on |
— | |
| 允许规划器使用 Memoize 缓存节点。 | 现存 | ||||
enable_mergejoin |
布尔 | 会话 | on |
— | |
| 允许规划器使用归并连接计划。 | 现存 | ||||
enable_nestloop |
布尔 | 会话 | on |
— | |
| 允许规划器使用嵌套循环连接计划。 | 现存 | ||||
enable_parallel_append |
布尔 | 会话 | on |
— | |
| 允许规划器使用并行感知的 Append 计划。 | 现存 | ||||
enable_parallel_hash |
布尔 | 会话 | on |
— | |
| 允许规划器使用并行哈希计划。 | 现存 | ||||
enable_partition_pruning |
布尔 | 会话 | on |
— | |
| 允许在规划和执行阶段裁剪分区。 | 现存 | ||||
enable_partitionwise_aggregate |
布尔 | 会话 | off |
— | |
| 允许按分区执行聚合与分组。 | 现存 | ||||
enable_partitionwise_join |
布尔 | 会话 | off |
— | |
| 允许按匹配分区执行连接。 | 现存 | ||||
enable_presorted_aggregate |
布尔 | 会话 | on |
— | |
| 允许规划器为带 ORDER BY 或 DISTINCT 的聚合提供预排序输入。 | 现存 | ||||
enable_self_join_elimination |
布尔 | 会话 | on |
— | |
| 允许消除可证明冗余的唯一自连接。 | 现存 | ||||
enable_seqscan |
布尔 | 会话 | on |
— | |
| 允许规划器使用顺序扫描计划。 | 现存 | ||||
enable_sort |
布尔 | 会话 | on |
— | |
| 允许规划器使用显式排序步骤。 | 现存 | ||||
enable_tidscan |
布尔 | 会话 | on |
— | |
| 允许规划器使用 TID 扫描计划。 | 现存 | ||||