2011-10-07 24 views
4

我從Postgres 8.1 docsEXPLAIN產生類似的表格數據見:將EXPLAIN結果放入表中?

在PostgreSQL 7.3,該計劃是在通知 消息的形式發射。現在它顯示爲一個查詢結果(格式如同一個表格,其中單個文本列爲 )。

我正在使用9.0,對此,docs表示,輸出可以是多種類型,包括TEXT和XML。我真正想要做的是把輸出作爲一個標準的查詢結果,這樣我可以生成一個查詢或一組查詢,例如一個簡單的報告,

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

以上不工作,我嘗試過的任何形式,並且我構造了屬性maxcost來演示如何整齊地提取特定數據位(在這種情況下,查詢的最大估計成本)。有什麼我可以做的,會讓我成爲那裏的一部分嗎?我寧願能夠在簡單的SQL控制檯中工作。

+0

來自文檔的引用顯示問題:「格式化爲像表*一樣的文本列*」。 –

+1

@johnFlatness:你能詳細說明還是提供答案?爲什麼單列表是一個問題? '選擇*從解釋......'在這種情況下仍然可以工作,不是嗎?我的投影屬性只是一個願望,而不是要求。 – beldaz

回答

1

到目前爲止沒有其他答案,所以這裏是我自己的刺傷。

這是可能的讀入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'); 
1

This message建議使用 「FOR REC IN EXECUTE EXPLAIN ......」,這似乎這樣的伎倆如:

drop table if exists temp_a; 
create temp table temp_a 
(
    "QUERY PLAN" text 
); 


DO 
$$ 
DECLARE 
rec record; 
BEGIN 

FOR rec IN EXECUTE 'EXPLAIN VERBOSE select version()' 
LOOP 
-- RAISE NOTICE 'rec=%', row_to_json(rec); 

    insert into temp_a 
    select rec."QUERY PLAN"; 
END LOOP; 

END 
$$ language plpgsql; 

select * 
from temp_a; 
+1

有趣。這是一個相當古老的帖子(8年前),所以我認爲'EXPLAIN'輸出的格式從那以後就改變了。 – beldaz

+2

@beldaz:格式可能已經改變,但'explain'仍然返回一個字符串列表,這應該工作得很好。 –

+0

@a_horse_with_no_name:感謝您的澄清。 「字符串列表」的解釋也很有幫助。非常接近於典型的單列關係格式,但卻不夠接近,無法處理。 – beldaz

相關問題