暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Postgres 查询计划可视化工具

飞象数据 2025-04-09
160

原文地址:

https://www.pgmustard.com/blog/postgres-query-plan-visualization-tools

当您遇到一个较慢的 Postgres 查询时,EXPLAIN 及其参数对于找出原因非常有用。

但是,返回的信息可能难以解释且耗时,尤其是对于更复杂的查询。多年来,人们已经构建了不少工具来可视化 Postgres 查询计划。作为这些人中的一员,我有点难以置信的偏见,但作为许多其他人的粉丝,我希望能公正地对待他们。

流行的 EXPLAIN 可视化工具

  1. The default TEXT format

  2. Explain Depesz

  3. Tatiyants PEV

  4. Explain Dalibo (PEV2)

  5. pgMustard (of course)

  6. Others

TEXT format

多年来,我越来越欣赏默认的 TEXT 格式。

TEXT 格式的查询计划的屏幕截图

虽然学习阅读可能很棘手,但它设计精良,随时可用,并且令人印象深刻的紧凑。从 Postgres 9.0 开始,我们还可以请求机器可读格式(如 JSON、YAML 和 XML)的查询计划,但这些格式远没有那么紧凑。

在文本格式中,您将看到表示树结构的小缩进箭头 ( -> ),然后基于每个操作进行统计。其中许多统计信息包括它们的子操作,还有一些是每个循环的平均值,这意味着在能够计算每个操作的 timings(或行或缓冲区)之前,您需要了解相当多的信息。我个人也发现大数字很难理解,因为它们不包含千位分隔符。要了解如何阅读这些查询计划,我推荐 Thoughbot 团队的这篇文章(如下连接)Josh Berkus 的这篇演讲(如下连接)以及我们的 EXPLAIN 词汇表(如下连接)。学习如何实际处理问题是一个额外事情。

https://thoughtbot.com/blog/reading-an-explain-analyze-query-plan

https://www.youtube.com/watch?app=desktop&v=mCwwFAl1pBU

https://www.pgmustard.com/docs/explain

即使有它的局限性,我知道一些专家大多在出现 EXPLAIN 计划时阅读它们,没有工具,即使是长查询计划也是如此。如果您愿意投入时间和精力,它仍然是一种非常有用的格式。

我相信对于使用 PostgreSQL 源代码的人来说,这也是最好的格式,当成本估算等略有不同的方面至关重要时。

总结:

  • 优点: 紧凑、随时可用、专家熟悉

  • 缺点: 难以学习阅读,没有下一步该怎么做的建议

Explain Depesz

Hubert “depesz” Lubaczewski 是 Postgres 社区的优秀成员,可以在许多在线空间中找到他,帮助人们左右和居中。他还为自己和他人创建了有用的应用程序,包括 explain.depesz.com(它是开源的,可以自托管)。

Explain Depesz 中查询计划的屏幕截图(单击它可查看交互式版本)

创建于 2007 年,此后一直受到欢迎、维护和改进。

它的两大优势是左侧的每次运算计时计算,以及右侧大部分保留的文本格式 explain (有一些细微的改进,例如大数的千位分隔符)。

许多人不知道的一个不错的功能是,它还接受 JSON、YAML 和 XML 格式的计划,同时仍然以 TEXT 格式样式显示它们。另一个是可以通过单击父节点来折叠整个子计划。

其他更明显的智能功能是,它可以对缓慢的操作、错误的行估计进行颜色编码,并在提供缓冲区时计算吞吐量。特别糟糕的事物将以红色突出显示,中等事物将以橙色突出显示,而轻微的事物将以黄色突出显示。

几年来,它还在有限的一组情况下提供提示,就如何加快某些查询的速度提供建议。

总结:

  • 优点: 易于使用,保留 TEXT 格式(专业友好),计算每次操作的时间,突出问题区域,免费和开源,维护良好

  • 缺点: 关于下一步做什么的建议有限

Tatiyants PEV

早在 2016 年,Alex Tatiyants 就创建了一个名为 PEV (Postgres Explain Visualizer) 的工具。Web 版本托管在 tatiyants.com/pev,但它也是免费和开源的。

PEV 中的查询计划的屏幕截图

PEV 很快就流行起来,我怀疑这要归功于它精美简单的设计。

它 (仅) 接受 JSON 格式的查询计划,并将其显示为树。它在保持界面简单的同时做了几项巧妙的事情,包括添加描述,以及按时间、行和估计成本突出显示最昂贵的操作。

即使是托管版本也在本地处理和存储查询计划,这对隐私来说非常有用,但当然也意味着 URL 不能共享。

超过 8 年没有更新,它大部分已被此列表中的下一个工具取代,但我偶尔会遇到仍然喜欢它的人。

总结:

  • 优点: 易于使用、简单直观(适合初学者)、计算每次操作的时间、突出显示问题区域、免费和开源

  • 缺点: 不再维护,没有下一步的建议,不支持 TEXT 格式计划

Explain Dalibo (PEV2)

2019 年,在 PEV 的工作停止后,来自 Dalibo 的 Pierre Giraud 开始对其进行分叉/重写,并亲切地将其称为 PEV2。explain.dalibo.com 有一个托管版本,它是免费和开源的。

Explain Dalibo 中的查询计划截图(点击查看交互式版本)

与 PEV 相比,一个重大改进是它同时支持 TEXT 和 JSON 格式计划。

另一个很棒的新增功能是侧面板,它可以显示每个统计数据的可视化效果,例如时间、行、成本或缓冲区。

在托管版本上,计划默认存储在服务器端,从而启用共享。

它还借鉴了 Explain Depesz 的问题颜色编码非常相似。它将指出不同品种的更多几类问题,尽管关于下一步该怎么做的建议较少。

总结:

  • 优点: 易于使用、直观(适合初学者)、计算每个操作的时间、突出显示相当多类型的问题、免费和开源、维护良好

  • 缺点: 关于下一步做什么的建议有限

pgMustard

2018 年,David Conlin 和我开始研究 pgMustard,这是另一个可视化查询计划的工具,但也提供性能建议。

pgMustard 中查询计划的屏幕截图(单击它可查看交互式版本)

与目前讨论的其他产品不同,pgMustard 是商业和闭源的,但它确实有免费试用(并且为个人和团队提供合理的定价)。

它支持 TEXT 和 JSON 格式的查询计划,但至少需要 EXPLAIN ANALYZE(带有计时数据)。

它将查询计划可视化为树(同时模仿 TEXT 格式结构),并在树上方添加一个图表(各种)以显示每个操作的时间分解。

为大量性能问题添加了提示,这些提示是根据对其节省时间潜力的估计进行评分的。这些提示以开发人员友好的语言描述问题,旨在帮助人们解决他们的问题,而无需进一步的帮助。

一些相对微妙的功能是我最喜欢的一些 — 默认情况下,它会折叠查询计划的快速部分(这对于大型计划特别有用),并尝试在查询已经非常快速或高效时明确(低分提示,或根本没有)。

我们花了更多的精力的一个重要方面是计算每次操作的时间。这是一个比我想象的更深奥的话题,但在某些情况下,在这些方面付出额外的努力会产生很大的不同。

我们还支持最新的 EXPLAIN 功能,包括 SERIALIZE 和 MEMORY(在 PostgreSQL 17 中添加)。

最后,在过去的几年里,我们添加了一个公共 API,允许人们自动评分保存计划,用于基准测试或优先级排序等操作。

  • 优点: 易于使用、直观(适合初学者)、计算每个操作的时间、突出显示相当多类型的问题、下一步做什么的建议、支持良好

  • 缺点: 花钱,需要定时数据

others

还有更多的 explain 可视化工具,包括几个包含它们的 IDE,其中许多看起来与 pgAdmin 中的这个类似:

pgAdmin 4 中查询计划的屏幕截图

这些往往侧重于显示信息而不是提供指导,但如果您已经使用过 IDE,则值得检查一下它内置了什么。

还有一个相对流行的俄语工具,用于可视化查询计划,我目前不会推广。

自然,人们现在也在尝试 LLM 聊天机器人,以获得解释查询计划的帮助。他们往往遭受常见的 LLM 问题,经常提出一些有帮助的事情,一些不会,还有一些是有害的。可能很难知道其中的区别,尤其是对于经验不足的人来说。总的来说,我还不认为他们节省的时间比浪费的时间多(为此目的)。

至少还有几个监控工具添加了自己的 explain 可视化,包括 pganalyze 和 Google Cloud SQL。他们处理问题的方式略有不同,但非常值得一试。

最后,如果你们中的任何人不幸也使用 MySQL(抱歉),我强烈建议您尝试 Tobias Petry 的 MySQL Explain 工具。

结论

有很多选项可用于可视化您的查询计划,并最终帮助您加快查询速度。每个人都有自己的优势,希望您至少能找到一个适合您的优势。

作为一个有趣的旁注,上面的屏幕截图来自同一个查询计划!

文章转载自飞象数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论