如何检查/知道最高运行查询

mam*_*aye 10 postgresql view materialized-view

我想收集数据库中运行次数最多的查询的统计信息。

为此,我需要知道如何跟踪查询,以便我可以创建视图或物化视图来缓存最高运行查询的结果,因为我有一个大数据库。

小智 11

正如有人在评论中所说,pg_stat_statements是获取统计信息的方式。把它放到你的postgresql.conf

shared_preload_libraries = 'pg_stat_statements'

pg_stat_statements.max = 10000
pg_stat_statements.track = all
Run Code Online (Sandbox Code Playgroud)

然后运行这个查询:

CREATE EXTENSION pg_stat_statements; 
Run Code Online (Sandbox Code Playgroud)

之后,此示例查询(从上面链接的文档中复制)将为您提供来自所有数据库的5 个顶级查询的统计信息:

SELECT query, calls, total_time, rows,
100.0 * shared_blks_hit / nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5;
Run Code Online (Sandbox Code Playgroud)

如果你想要单个数据库的结果,你需要过滤dbid你可以pg_database通过数据库名称获取的结果。将此 WHERE 子句添加到上面的查询中:

WHERE dbid = (select oid from pg_database where datname = 'YOUR_DB_NAME')
Run Code Online (Sandbox Code Playgroud)

你也可以加入。

当您对此进行测试时,最好将查询排除在 stats/schema 表本身,例如:

AND query not similar to '%( pg_|information_schema)%'
Run Code Online (Sandbox Code Playgroud)

许多免费和商业工具可以帮助您可视化数据。

  • 现在(postgres 14)那里没有“total_time”,但有“total_exec_time” (3认同)