【问题标题】:Store XML explain plan in PostgreSQL database在 PostgreSQL 数据库中存储 XML 解释计划
【发布时间】:2013-01-22 17:29:56
【问题描述】:

如何在 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语句中似乎都不能使用explain,以下语句也不起作用:

select * from (explain (verbose, format xml) select 1) a

我们使用的是 PostreSQL 9.1.6

【问题讨论】:

    标签: xml plpgsql postgresql-9.1 explain


    【解决方案1】:

    无法使用子查询捕获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

    【讨论】:

      【解决方案2】:

      我不是 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;
      $$;
      

      【讨论】:

        猜你喜欢
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-08
        • 1970-01-01
        • 2012-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多