【问题标题】:How to benchmark a set of PostgreSQL queries?如何对一组 PostgreSQL 查询进行基准测试?
【发布时间】:2017-06-12 21:20:04
【问题描述】:

我有 batch 的 SQL 基准查询,我想执行并计算它们的时间。我不想想用 EXECUTE ANALYZE 命令获取执行计划。

基于此处建议的方法Get execution time of PostgreSQL query 我为每个查询编写了一个包含以下代码的过程

-------------------------
Query = 'Q1';
StartTime := clock_timestamp();

PERFORM <** Query 1 goes here **>

EndTime := clock_timestamp();
Duration := 1000 * ( extract(epoch from EndTime) - extract(epoch from StartTime) );
INSERT INTO execution_tests VALUES (Query, StartTime, EndTime, Duration);
-------------------------

我使用 PERFORM 而不是 SELECT 来执行查询并丢弃结果。

这适用于简单查询,但我有许多带有 WITH 子句的查询。根据说明书

对于 WITH 查询,请使用 PERFORM,然后将查询放在括号中。 (在这种情况下,查询只能返回一行。)

但是,我需要进行基准测试的所有 WITH 查询都返回多行。

如何解决这个问题?

【问题讨论】:

    标签: postgresql benchmarking common-table-expression sqlperformance


    【解决方案1】:

    类似的东西呢

    do $$
    declare
      p json;
      your_query text := 'select pg_sleep(1.1)';
      t interval;
    begin
      execute 'explain (analyse, format json) ' || your_query into p;
      raise info '%', p;
      t := make_interval(secs := ((p->0->>'Planning Time')::float + (p->0->>'Execution Time')::float)/1000);
      raise info '%', t;
    end $$;
    

    【讨论】:

    • 太棒了!谢谢 !如何在 RAISE INFO 之后删除 CONTEXT 消息?我试过 ALTER DATABASE test3 SET log_error_verbosity = TERSE;但没有用。附言我在 pgAdmin 上执行
    • @EstebanZimanyi 不确定你的意思。这只是一个例子。据我了解,您想将执行时间存储到表中...
    • 确实,但每次消息被删除时删除所有消息,例如“CONTEXT: PL/pgSQL function test_queries() line 262 at RAISE”也很好(在这个特定示例中不一定)执行长脚本时显示在屏幕上,例如对具有不同比例因子的长批次查询进行基准测试。有没有办法做到这一点?
    • @EstebanZimanyi 问题是我这里没有这样的消息添加。所以没有任何想法。
    • @EstebanZimanyi 好像是psql 特征:depesz.com/2008/07/12/suppressing-context-lines-in-psql
    猜你喜欢
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多