2017-07-03 8 views
3

バインド・パラメータを持つ問合せに対してexplain文を実行したいと考えています。バインドパラメータを持つPostgrSQLの準備クエリで「Explain」文を実行するにはどうすればよいですか?

EXPLAIN SELECT * FROM metasyntax WHERE id = $1; 

私はこれを実行しようとすると、私は次のエラーを取得:たとえば

ERROR: bind message supplies 0 parameters, but prepared statement "" requires 1 

を、私は、クエリの値を供給するために私を望んでいることを私に言っています理解しています。しかし、私は必ずしもその答えを知っているとは限りません。 Oracleなどの他のSQLダイアレクトでは、パラメータの値を指定する必要なく、Explainプランが生成されます。

実際の値にバインドせずにEXPLAIN PLANを取得することはできますか?ありがとう!

+1

実行計画は、パラメータの値によって異なる場合があります。[例](http://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=cd52792a97ce9c34bc3e9dfbce041292) – Abelisto

+0

いいえ。オプティマイザは、パラメータに基づいてクエリプランを変更できます。 – Bohemian

答えて

1

オプティマイザは、パラメータに基づいてクエリプランを変更することが許されます。パラメータがnullだったとしたら、行が返されないことは明らかです。そのため、DBは空の行セットを即座に返すことがあります。

代表値を使用してください。パラメータを仮定

+0

正しい。しかし、 'PREPARE'は、' EXPLAIN EXECUTE myplan(params) '計画を使うことができます。 –

1

は整数:

PREPARE x(integer) AS SELECT * FROM metasyntax WHERE id = $1; 

そしてここが代表値であり、次の6回実行:

EXPLAIN (ANALYZE, BUFFERS) EXECUTE x(42); 

通常PostgreSQLはのための一般的な計画に切り替わり6番目の実行では、プレースホルダ$1を含むプランが表示されます。

関連する問題