如何在PostgreSQL数据库中存储XML解释计划(或任何其他格式)?
测试数据:explain (verbose, format xml) select 1
存储结果的表:create table tmp.explain_plan_data (expp xml);
我天真的测试失败了:
insert into tmp.explain_plan_data values (explain (verbose, format xml) select 1);
似乎解释不能在任何其他select
语句中使用,以下语句也不起作用:
select * from (explain (verbose, format xml) select 1) a
我们正在使用PostreSQL 9.1.6
答案 0 :(得分:3)
我不是百分百肯定,但我认为这只能使用存储过程。您可以使用DO语句:
DO
$$
DECLARE
_result xml;
BEGIN
EXECUTE 'explain (verbose, format xml) select 1' INTO _result;
INSERT INTO tmp.explain_plan_data(expp) VALUES(_result);
END;
$$;
答案 1 :(得分:3)
使用子查询无法捕获EXPLAIN
输出,您应该选择PL / pgSQL过程:
CREATE OR REPLACE FUNCTION explain_v_xml(in_sql text)
RETURNS TABLE(explain_line xml) AS $explain_v_xml$
BEGIN
RETURN QUERY EXECUTE 'EXPLAIN (VERBOSE, FORMAT xml) '||in_sql;
END;
$explain_v_xml$ LANGUAGE plpgsql;
现在您可以这样查询:
SELECT explain_line FROM explain_v_xml('SELECT * FROM pg_locks');
并插入目标表:
INSERT INTO tmp.explain_plan_data SELECT explain_v_xml('SELECT 1');
SELECT * FROM tmp.explain_plan_data;
或许在表格中单独解释输出并不是那么方便,我宁愿补充一下
原始查询和插入的timestamptz
。