内容提要
PostgreSQL 新增 pg_stat_plans 扩展,功能类似 pg_stat_statements,但按查询计划而非语句统计。作者将其集成到 pgwatch:通过 YAML 定义指标和源,定期采集数据存入 sink 库,再用 Grafana 面板展示同一查询的不同计划(如嵌套循环与哈希连接),便于调试高耗资源查询。
延伸解读
pg_stat_plans 与 pg_stat_statements 的差异
pg_stat_plans 是 PostgreSQL 新推出的扩展,其统计维度与 pg_stat_statements 不同:后者按 SQL 语句聚合,而前者按查询计划聚合。这意味着同一查询若因参数或统计信息变化而生成不同计划,pg_stat_plans 会分别记录。对于需要深入分析计划选择、诊断计划突变问题的场景,这一粒度更有针对性。
集成 pgwatch 的关键步骤
将 pg_stat_plans 集成到 pgwatch 需完成三步:首先在 PostgreSQL 中安装并加载扩展;然后编写查询关联 pg_stat_statements 与 pg_stat_plans,以获取高资源消耗查询的计划;最后在 pgwatch 的 YAML 配置中定义该查询为指标(如 stat_plans),并设置采集间隔和源。pgwatch 会定期执行查询并将结果存入 sink 数据库,供后续可视化。
Grafana 面板的实用价值
通过扩展 pgwatch 的 Single query details 仪表板,添加表格面板展示同一查询的不同计划及其统计信息,可以直观对比计划差异。例如,文章示例中同一查询出现了嵌套循环连接和哈希连接两种计划。这有助于验证索引创建后计划是否改变,或排查因计划选择导致的性能波动,而无需依赖开发团队提供查询文本。
Q&A
pg_stat_plans 扩展是什么?它和 pg_stat_statements 有什么区别?
pg_stat_plans 是 PostgreSQL 新推出的扩展,功能类似 pg_stat_statements,但它是按查询计划(query plans)而不是 SQL 语句来聚合统计信息。它通过 pg_stat_plans 视图提供 SQL 接口来查询这些统计信息。
如何将 pg_stat_plans 集成到 pgwatch 中进行监控?
首先确保已安装并加载 pg_stat_plans 扩展。然后编写一个查询,将 pg_stat_statements 与 pg_stat_plans 连接,以获取最耗资源查询的计划。接着在 pgwatch 配置中定义该查询为指标(例如命名为 stat_plans),指定采集间隔,并启动 pgwatch。pgwatch 会定期连接数据库执行该查询,并将结果存储到配置的 sink 中。
pgwatch 支持哪些配置存储方式?
pgwatch 支持两种方式存储配置和指标定义:一种是使用 YAML 文件,另一种是使用 PostgreSQL 数据库(或任何支持 wire 协议的数据库)。
如何用 Grafana 展示 pg_stat_plans 收集的数据?
可以扩展 pgwatch 的 Single query details 仪表板,添加一个新的表格面板,显示当前调查的单个查询的不同计划及其统计信息。面板中的查询从 sink 数据库中获取特定查询在指定时间间隔内的最新 stat_plans 指标测量值。配置 Grafana 连接到 sink 数据库,添加该仪表板并重启即可看到结果。
使用 pg_stat_plans 和 pgwatch 能解决什么问题?
可以调试数据库中资源消耗最大的查询的查询计划,而无需向开发团队询问查询文本。还可以比较规划器考虑的不同计划,确保创建索引后使用新计划等。
在 Grafana 中如何查询 sink 数据库以获取特定查询的最新计划统计?
在新增的表格面板中,使用一个查询从 sink 数据库的 stat_plans 表中获取特定查询在 Grafana 用户指定时间间隔内的最新 stat_plans 指标测量值。具体查询语句可参考文章中的示例。