EXPLAIN ANALYZEはplpgsql関数内のクエリの詳細を表示しません


18

PostgreSQL 9.3でPL / pgSQL関数を使用し、いくつかの複雑なクエリを内部で使用しています。

create function f1()
  returns integer as
$$
declare

event tablename%ROWTYPE;
....
....

begin

FOR event IN
   SELECT * FROM tablename WHERE condition
LOOP
   EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return;
END LOOP;

...

INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN c WHERE ...

UPDATE T SET cl1 = M.cl1 FROM M WHERE M.pkcols = T.pkcols;

...

end
$$ language plpgsql;

実行した場合EXPLAIN ANALYZE f1()、合計時間のみが取得され、詳細は取得されません。関数内のすべてのクエリの詳細な結果を取得する方法はありますか?

関数内のクエリがPostgresによって最適化されるべきではない場合、説明を求めます。


2
auto_explain.log_nested_statements役立つかもしれません。参照してくださいpostgresql.org/docs/9.3/static/auto-explain.html
ダニエル・ベリテ

回答:


15

まず、EXPLAIN呼び出しの正しい構文にはが必要SELECTです。SQLでそのままの関数名を書くことはできません。

EXPLAIN ANALYZE SELECT f1();

最適化

PL / pgSQL関数はクエリプランナーにとってブラックボックスです。クエリは、内部されているだけで、他のクエリと同様に最適化されますが、別途、準備文のように一つずつ、および実行計画は、セッションの間キャッシュされる場合があります。詳細:

EXPLAIN 関数本体

@Danielが既にコメントしたように、追加モジュールauto_explainを使用して、詳細(多くの詳細)を取得できます。plpgsql関数内のステートメントは、「ネストされたステートメント」と見なされます。必ず設定してください

SET auto_explain.log_nested_statements = ON

詳細な手順:

ルールの例外として、非常に単純なSQL関数(plpgsqlではない)が「インライン化」される場合があります。つまり、関数コードが外部クエリに挿入され、最初に関数がなかったようにすべてが実行されます。このような場合、クエリプランには詳細な情報が含まれます。


以下のように「auto_explain」を有効にした後、「auto_explain」をロードします。auto_explain.log_min_duration = 0を設定します; set auto_explain.log_nested_statements = ON; SET auto_explain.log_analyze = true; ログファイルのmsgを下回っています。「2014-12-08 18:21:59 ISTログ:クライアントからデータを受信できませんでした:ターゲットマシンが積極的に拒否したため、接続できませんでした」実際の問題....
skumar 14

注:plpgsql関数を実行した後、ログファイルでmsgを超えています。
スクマー14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.