让非生产环境 Planner 更像生产环境

本页目录

为了实现查询优化的目标 — 运行 EXPLAIN (ANALYZE, BUFFERS) 并验证各种优化想法,比如新索引,确保 Postgres 规划器的行为与生产数据库的规划器完全相同或者相似至关重要。幸运的是,无论非生产机器上可用的资源 (CPU、RAM、磁盘 IO) 如何,这都是可以实现的。

此处描述的技术已用于 DBLab Engine @Database_Lab,支持数据库克隆/分支,以进行查询优化和 CI/CD 中的数据库测试。

要实现规划器的生产/非生产行为一致性,需要两个组件:

  1. 相匹配的数据库设置
  2. 相同或非常相似的统计信息 (pg_statistic 中的内容)

相匹配的数据库设置

在生产数据库上使用以下查询获取会影响规划器行为的非默认设置列表:

SQL
select
  format(e'%s = %s', name, setting) as configs
from
  pg_settings
where
  source <> 'default'
  and (
    name ~ '(work_mem$|^enable_|_cost$|scan_size$|effective_cache_size|^jit)'
    or name ~ '(^geqo|default_statistics_target|constraint_exclusion|cursor_tuple_fraction)'
    or name ~ '(collapse_limit$|parallel|plan_cache_mode)'
  );

注意:

相匹配的统计信息

一个有趣的想法是将生产环境中的 pg_statistic 内容转储并恢复到更小的测试环境中,而无需实际数据。尽管这种方法不常见,但可能可以使用 pg_dbms_stats 来实现。

🎯 TODO:测试 pg_dbms_stats 并查看其效果。

一个简单的思路是使用相同大小的数据库。这里有两个选项:

注意:

总结

为了让非生产环境中的 Postgres 规划器与生产环境中一致,执行以下两步:

  1. 调整非生产环境中的某些 Postgres 设置 (与规划器相关,如work_mem),使其与生产环境匹配。
  2. 尽可能从生产环境复制数据库,优先选择物理方式的拷贝,并且可能的话,尽量避免数据修改。对于超快速交付克隆,考虑使用 DBLab Engine @Database_Lab。

讨论与补充

在 GitHub 查看讨论

支持作者

感谢支持 PostgreSQL Howto 的长期维护。

微信赞赏码

读者交流群

二维码若已过期,可通过公众号 PostgreSQL 学徒或邮件联系。

PostgreSQL 学徒读者交流群二维码