2

如何在 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

4

2 回答 2

3

我不是 100% 确定,但我认为这只能使用存储过程。您可以使用 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;
$$;
于 2013-02-07T09:23:49.683 回答
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插入。

于 2013-02-07T09:29:48.510 回答