如何计算查询时间的累计和?

How to calculate accumulated sum of query timings?

我有一个 sql 文件 运行 有很多查询。我想查看所有查询的累计总和。我知道如果我打开计时,或者调用

\timing
 query 1;
 query 2;
 query 3;
 ...
 query n;

在脚本的开头,它将开始显示每个查询到 运行 所花费的时间。但是,我需要所有查询的累积结果,而不必手动添加它们。

有系统的方法吗?如果没有,我如何获取临时时间以将它们放入变量中。

如果您想为整个脚本计时,在 linux 或 mac 上,您可以使用 time 实用程序启动脚本。

本例中的测量值比原始查询时间的总和略多一些,因为它包括启动和 运行 psql 命令的一些开销。在我的系统上,这个开销大约是 20 毫秒。

$ time psql < script.sql

…

real    0m0.117s
user    0m0.008s
sys     0m0.007s

real 值是执行整个脚本所花费的时间,包括上述开销。


此答案中的方法是一种粗糙、简单的客户端方法,用于测量整个脚本的运行时间。测量 milli-second 精确的服务器端执行时间没有用。对于许多 use-cases.

来说,它可能仍然足够

Kaushik Nayak 的解决方案是一种更精确的方法,可以直接在服务器上计时执行。它还提供了对执行的更多洞察(例如查询级别时间)。

pg_stat_statements 是一个很好的模块,它提供了一种跟踪执行统计信息的方法。

  1. 首先,将pg_stat_statements添加到shared_preload_librariespostgresql.conf 文件。要知道此 .conf 文件在您的 文件系统,运行 show config_file;

    shared_preload_libraries = 'pg_stat_statements'
    
  2. 重启 Postgres 数据库
  3. 创建扩展

    CREATE EXTENSION pg_stat_statements;
    

现在,该模块提供了Viewpg_stat_statements,可以帮助您分析各种查询执行指标。

重置 运行ning 查询前收集的统计数据内容。

SELECT pg_stat_statements_reset();

现在,执行包含查询的脚本文件。

\i script_file.sql

您可以获得所有执行的查询的所有时间统计信息。要获得总耗时,只需 运行

select sum(total_time) from  pg_stat_statements 
    where query !~* 'pg_stat_statements';

您得到的时间在 milliseconds 中,可以使用各种 timestamp 相关的 Postgres 函数将其转换为所需的格式