对许多 PostgreSQL 查询进行基准测试
Benchmarking many PostgreSQL queries
在一个复杂的网页上执行了数百个查询。我正在寻找一种方法来对这些查询进行基准测试。
我试图将 EXPLAIN ANALYZE 嵌入到查询中。进入 psql 函数,选择每个查询的执行时间并进行比较。
但是 EXPLAIN ANALYZE 似乎无法以任何方式嵌入。
是否有其他解决方案来比较某些查询的执行时间?
非常感谢
在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 注入的攻击。
在一个复杂的网页上执行了数百个查询。我正在寻找一种方法来对这些查询进行基准测试。 我试图将 EXPLAIN ANALYZE 嵌入到查询中。进入 psql 函数,选择每个查询的执行时间并进行比较。 但是 EXPLAIN ANALYZE 似乎无法以任何方式嵌入。
是否有其他解决方案来比较某些查询的执行时间?
非常感谢
在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 注入的攻击。