他の回答はこれまでありませんでしたので、ここに自分の刺し傷があります。
それはplpgsqlが内変数に説明の結果を読み取ることが可能だし、出力はXMLにすることができるので1は、XPathを使用して、トップレベルのコストを得るために保存された機能でEXPLAIN
をラップすることができます:
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');
docsからのあなたの見積もりには、「1つのテキスト列を持つテーブル*のようにフォーマットされています」という問題が示されています。 –
@johnFlatness:答えを出したり、答えを出すことはできますか?単一列表が問題になるのはなぜですか? 'SELECT * FROM EXPLAIN ... 'は、このような状況ではまだ動作しますか?属性に投影した私の例は、ほんの欲望であり、要件ではありませんでした。興味深い。 – beldaz