微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – 将EXPLAIN结果放入表中?

我从 Postgres 8.1 docs看到EXPLAIN生成了类似于表格数据:

Prior to Postgresql 7.3,the plan was emitted in the form of a NOTICE
message. Now it appears as a query result (formatted like a table with
a single text column).

我正在使用9.0,为此,docs说,输出可以是各种类型,包括TEXT和XML.我真正想做的是将输出视为标准查询结果,以便为查询或一组查询生成简单的报告,例如,

SELECT maxcost FROM (
    EXPLAIN VERBOSE 
    SELECT COUNT(*) 
      FROM Mytable
     WHERE value>17);

上面的内容不能用于我尝试过的任何形式,并且我编写了属性maxcost来演示抽取特定数据位(在这种情况下,查询的最大估计成本)是多么简洁.我能做些什么会让我成为那里的一部分吗?我宁愿能够在一个简单的sql控制台中工作.

解决方法

到目前为止还没有其他答案,所以这是我自己的努力.

可以将解释结果读入plpgsql中的变量,并且由于输出可以是XML,因此可以将EXPLAIN包装在存储函数中,以使用xpath产生顶级成本:

CREATE OR REPLACE FUNCTION estimate_cost(IN query text,OUT startup numeric,OUT totalcost numeric,OUT planrows numeric,OUT planwidth numeric)
AS
$BODY$
DECLARE
    query_explain  text;
    explanation       xml;
    nsarray text[][];
BEGIN
nsarray := ARRAY[ARRAY['x','http://www.postgresql.org/2009/explain']];
query_explain :=e'EXPLAIN(FORMAT XML) ' || query;
EXECUTE query_explain INTO explanation;
startup := (xpath('/x:explain/x:Query/x:Plan/x:Startup-Cost/text()',explanation,nsarray))[1];
totalcost := (xpath('/x:explain/x:Query/x:Plan/x:Total-Cost/text()',nsarray))[1];
planrows := (xpath('/x:explain/x:Query/x:Plan/x:Plan-Rows/text()',nsarray))[1];
planwidth := (xpath('/x:explain/x:Query/x:Plan/x:Plan-Width/text()',nsarray))[1];
RETURN;
END;
$BODY$
LANGUAGE plpgsql;

因此,问题的例子变成:

SELECT totalcost
FROM estimate_cost('SELECT COUNT(*) 
      FROM Mytable
     WHERE value>17');

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐