使用 EXPLAIN
要弄清楚为什么语句执行时间过长,可以使用 EXPLAIN 命令。您可以通过多种方式运行 EXPLAIN;如果使用 EXPLAIN ANALYZE,它将实际运行语句,并让您比较计划器认为会发生的事情与实际发生的事情。请注意,如果语句更改了数据,那么当您使用 EXPLAIN ANALYZE 运行时,也会发生更改;如果您只使用 EXPLAIN,那么语句不会对数据库进行任何操作。
有一些工具可以帮助解释 EXPLAIN 输出。
- pgadmin 包含一个可视化 EXPLAIN 工具,它有助于绘制实际发生的事情的映射。请参阅 阅读 PgAdmin 图形化 Explain 计划。
- Visual Explain,最初是 RedHat 组件,由 EnterpriseDB 保持更新并改进,与 EnterpriseDB Advanced Server 包捆绑在一起。它可以被构建为使用其 Developer Studio 包的源代码针对其他 PostgreSQL 安装运行。
- PostgreSQL 执行计划可视化器 显示查询计划的视觉树,每个节点都包含几个详细信息 (GitHub 代码库)。一个 旧版本 存在,但无法正确渲染带有并行工作者的计划 (博客文章,GitHub 代码库)。
- explain.depesz.com 显示带有提取的汇总时间和基于所选条件突出显示的 Explain 计划。
- pgMustard 是一款商业工具(提供免费试用版),它可以可视化 EXPLAIN 输出并提供性能改进建议。
- explain-postgresql.com 分析来自 PostgreSQL 以及相关数据库(Greenplum、Citus、TimescaleDB 和 Amazon RedShift)的 EXPLAIN 计划。显示计划和节点详细信息以及使用饼图、流程图和图块地图的视觉效果,还提供智能建议来改进查询。个人使用免费。
此外,还有一些关于此主题的教程,其中许多都以“解释 Explain”为标题。虽然许多教程都涉及直接基础知识,但它们按时间顺序列出在此处:
- 高效 SQL,作者 Greg Sabino Mullane (2003)
- 解释 Explain:pdf,作者 Robert Treat (2005)
- 解释 Explain,作者 Lukas Smith (2006)
- 解释 Explain,作者 Greg Stark (2008)
- PostgreSQL 中的查询执行技术,作者 Neil Conway
- 介绍 VACUUM、ANALYZE、EXPLAIN 和 COUNT,作者 Jim Nasby
- PostgreSQL 查询计划器,作者 Robert Haas (2010)
- PostgreSQL 9.0 高性能 (2010) 是一本关于如何使用 EXPLAIN、阅读生成的查询计划以及进行更改以获得不同计划的书。
- 了解 Explain,作者 Guillaume Lelarge (2012),是一本 42 页的指南。
- EXPLAIN 解释 是 Josh Berkus (2016) 的一次演讲。
- 解释查询优化器,作者 Bruce Momjian (2016 视频 - 跳到 1:24:00 左右)
- 初学者阅读 Postgres 查询计划,作者 David Conlin (2018)
- Postgres EXPLAIN 解释,作者 Baron Schwartz (2019)
- EXPLAIN 词汇表,作者 Michael Christofides (2020)
- PostgreSQL EXPLAIN,作者 Devart (2023)
在线文档中还包含一个关于性能技巧的部分。
导致计划器做出错误决策的一个常见问题是未保持 计划器统计信息 更新。另一个问题是将允许服务器了解可用内存的调整参数保留在非常小的默认值。例如,在默认配置中,超过 4MB 的排序操作将被交换到磁盘,因为它们太大而无法在内存中处理。 调整 PostgreSQL 服务器 涵盖了调整内存大小以及大多数影响查询计划的其他调整参数的最佳做法。
当您被计划困扰时,可以将完整的 EXPLAIN ANALYZE 输出以及涉及的查询的模式提交到 pgsql-performance 邮件列表。为了更快地获得有用的回复,请在发布之前阅读 SlowQueryQuestions。请注意,如果您没有运行相对较新的 PostgreSQL 版本,那么您可能得到的答复是这个问题在更高版本中已解决。您不妨尝试至少更新到当前使用的版本的最新更新(例如,如果您使用的是 11.3,则升级到 11.6,因为它是当前的最新版本),看看是否能改善您得到的计划。
这里的高级技术是随着时间的推移保存 Explain 计划,并查看随着表中数据量的增长,它们是如何变化的。这可以让你了解你是否足够积极地收集统计信息。一个简单的 pl/pgsql 例子在 Explain 的通用选项 中。