如何在 Postgresql 中影响查询规划

主要观点:Aurora 的 Query Plan Manager(QPM)可解决 Postgresql 查询规划器选择不佳导致执行时间和性能差异巨大的问题,能在生产问题出现时快速纠正规划错误,使数据库恢复稳定状态。
关键信息

  • 操作上用 QPM 处理生产问题分三步:识别问题查询、连接数据库强制使用好计划(通过提示等方式)、用 QPM 锁定好计划为“Approved”,坏计划为“Rejected”。
  • 示例中先创建有规划问题的表,模拟数据修改导致表统计信息出错,使 Postgresql 从使用索引快速执行变为不使用索引缓慢执行,然后通过 QPM 修复,包括开启 QPM 跟踪计划、强制使用好计划让 QPM 捕捉、拒绝坏计划并锁定好计划等步骤。
    重要细节
  • QPM 处于实际世界,注重解决问题而非理论纯净,能快速纠正规划错误,从检测到纠正时间以分钟计。
  • 启用 QPM 及参数设置在 AWS 文档中有详细说明,本文假设已设置好apg_plan_mgmt扩展。
  • 表统计信息histogram_bounds影响查询规划,远离分布边缘时行估计较准确,可利用此特性让 Postgresql 改变使用索引的计划。
  • dba_plans表中各字段含义,如sql_hashplan_hashenabledstatus等。
  • 强制使用好计划可通过运行explain analyze并设置set_enable_x标志,如禁用顺序扫描。
  • 使用apg_plan_mgmt.set_plan_status函数拒绝坏计划和锁定好计划,QPM 虽不是万能,但能在一定程度上影响规划器选择。
  • QPM 存在局限性,如作为扩展存在于核心规划器之外,处理 SQL 规范化和计划哈希时可能出现问题,工具原始,需要提前练习和准备。

有用链接:

阅读 8
0 条评论