将 EXPLAIN 结果放入表中?

bel*_*daz 5 postgresql

我从Postgres 8.1 文档中看到生成EXPLAIN了类似表格数据的内容:

在 PostgreSQL 7.3 之前,计划以 NOTICE 消息的形式发出。现在它显示为查询结果(格式类似于具有单个文本列的表)。

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

SELECT maxcost FROM (
    EXPLAIN VERBOSE 
    SELECT COUNT(*) 
      FROM Mytable
     WHERE value>17);
Run Code Online (Sandbox Code Playgroud)

上面的内容在我尝试过的任何形式下都不起作用,我编写了该属性maxcost来演示提取特定数据位(在本例中为查询的最大估计成本)是多么简洁。我能做些什么来帮助我实现这一目标吗?我希望能够在简单的 SQL 控制台中工作。

bel*_*daz 3

到目前为止还没有其他答案,所以这是我自己的尝试。

可以将解释的结果读入 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()', explanation, nsarray))[1];
planrows := (xpath('/x:explain/x:Query/x:Plan/x:Plan-Rows/text()', explanation, nsarray))[1];
planwidth := (xpath('/x:explain/x:Query/x:Plan/x:Plan-Width/text()', explanation, nsarray))[1];
RETURN;
END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

因此,问题中的示例变为:

SELECT totalcost
FROM estimate_cost('SELECT COUNT(*) 
      FROM Mytable
     WHERE value>17');
Run Code Online (Sandbox Code Playgroud)