gpt4 book ai didi

postgresql - 将 EXPLAIN 结果放入表中?

转载 作者:行者123 更新时间:2023-11-29 11:35:36 27 4
gpt4 key购买 nike

我从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 控制台中工作。

最佳答案

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

可以将 explain 的结果读取到 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;

因此问题中的示例变为:

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

关于postgresql - 将 EXPLAIN 结果放入表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7682102/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com