🔧 1 扫描方式控制参数
| 参数名 | 作用 | 默认值 |
|---|---|---|
enable_seqscan |
控制是否允许全表顺序扫描(禁用后优化器优先选索引,但无法完全禁止全表扫描) | on |
enable_indexscan |
控制是否允许索引扫描 | on |
enable_bitmapscan |
控制是否允许位图扫描(结合多个索引时常用) | on |
enable_indexonlyscan |
控制是否允许仅索引扫描(无需回表) | on |
enable_tidscan |
控制是否允许TID(行物理地址)扫描 | on |
🔄 2 表连接方式控制参数
| 参数名 | 作用 | 适用场景 |
|---|---|---|
enable_nestloop |
控制是否允许嵌套循环连接(小表驱动或索引高效时优先) | 小数据集、索引条件精确匹配 |
enable_hashjoin |
控制是否允许哈希连接(大表等值连接、内存充足时高效) | 等值连接、无索引的大表关联 |
enable_mergejoin |
控制是否允许合并连接(数据已排序或关联键有序时高效) | 有序数据集、非等值连接(如范围) |
⚙️ 3 聚合与排序控制参数
| 参数名 | 作用 |
|---|---|
enable_hashagg |
控制是否允许哈希聚合(GROUP BY 操作,内存充足时高效) |
enable_sort |
控制是否允许显式排序(如 ORDER BY,禁用后优化器优先选索引避免排序) |
enable_material |
控制是否允许物化中间结果(如缓存子查询结果) |
💎 4 其他相关参数
| 参数名 | 作用 |
|---|---|
enable_parallel_hash |
控制是否允许并行哈希连接(需并行查询支持)
7
8
|
enable_incremental_sort |
控制是否允许增量排序(避免全量重排序)
4
|
enable_partition_pruning |
控制是否允许分区表裁剪(自动过滤无关分区)
4
|
⚠️ 5 使用注意事项
-
临时生效:
- 通过
SET命令修改仅影响当前会话,重启后失效
- 通过
-
全局配置:
在postgresql.conf中修改可永久生效,但需重启实例: -
性能影响:
- 盲目禁用操作可能导致性能下降(如关闭
enable_seqscan后若无可选索引,仍会全表扫描但代价计算失真) - 建议通过
EXPLAIN ANALYZE验证计划有效性:
- 盲目禁用操作可能导致性能下降(如关闭
-
优先级规则:
- 优化器在禁用某操作后,仍可能因无替代方案而强制使用(如
enable_nestloop=off时若无其他连接方式,仍用嵌套循环)
- 优化器在禁用某操作后,仍可能因无替代方案而强制使用(如
💡 6 示例:强制使用嵌套循环连接
此时优化器将优先选择 Nested Loop Join
posted on
浙公网安备 33010602011771号