明確な計画


PostgreSQLは、共有のクエリ実行計画キャッシュを持っていませんが、 プリペアドステートメントではオプションとして クエリ実行計画キャッシュを使用できます。これにより、 プリペアドステートメントをクエリ計画キャッシュありで使うかなしで使うかを 開発者が選択できます。ただし、プリペアドステートメントをクローズすると キャッシュは削除されてしまう点に注意しましょう。

各言語でこの機能を使う方法は次の通りです。

C

ネイティブなC APIでは、PQexecParamsという、 プリペア時にバインドパラメータを使用できる機能が提供されています (PQprepareと対応)。

Java

The PostgreSQLのJDBCドライバは、PGStatement 及びPGConnectionの 標準にはないメソッドであるsetPrepareThresholdを使って サーバサイドプリペアを 制御します。

デフォルト設定は、 最初の4回の実行ではプリペア時にバインドパラメータを使い、 最後の1回は使わないという、5になっています。カウンタは PreparedStatementごとに新しく0から始まります。

警告

PreparedStatementキャッシュを使うフレームワークは たくさんあり、データソースのセットアップ時に prepared-statement-cache-sizeで設定できます。 そのため、意図せず制限に引っ掛かる事もあり得ます。

Ruby

RubyのPGconn.execは、 オプション引数としてバインドパラメータを受け入れます。 バインドパラメータが渡された場合は、計画の際にそれが使われます。

Photo of Markus Winand
Markus Winand氏は、開発者がSQLパフォーマンスを改善するお手伝いをしています。 彼は、SQL Performance Explainedの 著者でもあり、出張トレーニングhttp://winand.at/での リモート講義も 行っています。