【问题标题】:How to calculate accumulated sum of query timings?如何计算查询时间的累积总和?
【发布时间】:2019-06-14 14:55:33
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您使用什么工具来运行“SQL 文件”?
  • 没有特定的工具,只是将它们提供给从命令行运行的 postgres sql 实例。是否有专门为此设计的工具?

标签: sql database postgresql benchmarking timing


【解决方案1】:

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

  1. 首先,在shared_preload_libraries 中添加pg_stat_statements postgresql.conf 文件。要知道这个 .conf 文件在你的 文件系统,运行show config_file;

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

    CREATE EXTENSION pg_stat_statements;
    

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

在运行查询之前重置收集的 stat 的内容。

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函数转换成所需的格式

【讨论】:

    【解决方案2】:

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

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

    $ time psql < script.sql
    
    …
    
    real    0m0.117s
    user    0m0.008s
    sys     0m0.007s
    

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


    这个答案中的方法是一种粗略、简单的客户端方法来衡量整个脚本的运行时间。测量毫秒精度的服务器端执行时间是没有用的。对于许多用例来说,它仍然足够了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多