【问题标题】:Benchmarking many PostgreSQL queries对许多 PostgreSQL 查询进行基准测试
【发布时间】:2017-04-03 08:06:11
【问题描述】:

在一个复杂的网页上执行了一百多个查询。我寻找一种方法来对这些查询进行基准测试。 我试图将 EXPLAIN ANALYZE 嵌入到查询中。进入 psql 函数,选择每个查询的执行时间并进行比较。 但是EXPLAIN ANALYZE似乎不能以任何方式嵌入。

是否有其他解决方案可以比较某些查询的执行时间?

非常感谢

【问题讨论】:

标签: postgresql psql postgresql-9.3


【解决方案1】:

在PL/pgSQL中嵌入EXPLAIN是没有问题的:

CREATE OR REPLACE FUNCTION profile(
      IN query text,
      OUT total_cost double precision,
      OUT runtime double precision
   ) RETURNS record
  LANGUAGE plpgsql STRICT AS
$$DECLARE
   j json;
BEGIN
   EXECUTE 'EXPLAIN (ANALYZE, FORMAT JSON) ' || query INTO j;
   total_cost := (j->0->'Plan'->>'Total Cost')::double precision;
   runtime := (j->0->'Plan'->>'Actual Total Time')::double precision;
   RETURN;
END;$$;

您可以使用它,例如:

test=> SELECT * FROM profile($$SELECT * FROM large WHERE val = 'mama'$$);
┌────────────┬─────────┐
│ total_cost │ runtime │
├────────────┼─────────┤
│   14542.43 │ 207.836 │
└────────────┴─────────┘
(1 row)

不要将它用于不受信任的查询,因为该函数容易受到 SQL 注入的攻击。

【讨论】:

  • 谢谢,这正是我需要的。
  • 使用Execution Time 代替Actual Total Time 会更准确吗?
  • @Bergi 我猜你是对的。但差异通常是微不足道的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多