web-dev-qa-db-ja.com

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

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によって最適化されるべきでない場合は、説明も求めます。

20
skumar

まず、EXPLAIN呼び出しの正しい構文にはSELECTが必要です。 SQLで単純な関数名を記述することはできません。

EXPLAIN ANALYZE SELECT f1();

最適化

PL/pgSQL関数は、クエリプランナーにとってブラックボックスです。 are 内のクエリは他のクエリと同様に最適化されますが、 separately と1つずつ1つは準備されたステートメントのようなものであり、実行プランはセッションの間キャッシュされる場合があります。詳細:

EXPLAIN関数本体

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

SET auto_explain.log_nested_statements = ON

詳細な手順:

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

17