2011-10-07 4 views
4

私は表形式のデータのようなPostgres 8.1 docsEXPLAINが生成何かから参照してください。EXPLAINの結果をテーブルに入れる?

は、PostgreSQL 7.3に

先立ち、計画はNOTICE メッセージの形で放出されました。これはクエリ結果として表示されます( の単一テキスト列の表のように書式設定されています)。

これは、docsと言っていますが、出力はTEXTやXMLなどさまざまな種類があります。私が本当にしたいことは、私は、クエリまたはクエリセットのための簡単なレポートを生成することができるようにでは動作しません上記

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

、例えば、標準クエリ結果として出力を扱うですどのフォームでも試してみましたが、特定のデータビット(この場合はクエリの推定コストの最大値)を引き出す方法を示すために、属性maxcostを作成しました。そこに私を入れることができる何かがありますか?私は単純なSQLコンソール内で作業できることを望んでいます。

+0

docsからのあなたの見積もりには、「1つのテキスト列を持つテーブル*のようにフォーマットされています」という問題が示されています。 –

+1

@johnFlatness:答えを出したり、答えを出すことはできますか?単一列表が問題になるのはなぜですか? 'SELECT * FROM EXPLAIN ... 'は、このような状況ではまだ動作しますか?属性に投影した私の例は、ほんの欲望であり、要件ではありませんでした。興味深い。 – beldaz

答えて

1

他の回答はこれまでありませんでしたので、ここに自分の刺し傷があります。

それは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'); 
1

This messageが使用することを提案している「RECのためのEXPLAIN EXECUTE ...」トリックなどを行うように思われた:

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

関連する問題