🔧 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 使用注意事项

  1. ​​临时生效​​:

     
    SET enable_hashjoin = off; -- 当前会话禁用哈希连接
     
    • 通过 SET 命令修改仅影响当前会话,重启后失效
  2. ​​全局配置​​:
    在 postgresql.conf 中修改可永久生效,但需重启实例:

     
    enable_mergejoin = off # 全局禁用合并连接
  3. ​​性能影响​​:

    • 盲目禁用操作可能导致性能下降(如关闭 enable_seqscan 后若无可选索引,仍会全表扫描但代价计算失真)
    • 建议通过 EXPLAIN ANALYZE 验证计划有效性:
       
      EXPLAIN ANALYZE SELECT * FROM t1 JOIN t2 ON t1.id = t2.id;
  4. ​​优先级规则​​:

    • 优化器在禁用某操作后,仍可能因无替代方案而强制使用(如 enable_nestloop=off 时若无其他连接方式,仍用嵌套循环)

💡 6 示例:强制使用嵌套循环连接

 
SET enable_hashjoin = off; SET enable_mergejoin = off; EXPLAIN SELECT * FROM orders o JOIN customers c ON o.cust_id = c.id;

此时优化器将优先选择 Nested Loop Join

 

 posted on 2025-06-10 10:21  xibuhaohao  阅读(48)  评论(0)    收藏  举报