Erwinはそれを釘付けにしますが、拡張クエリプロトコルを使用すると、プリペアドステートメントのより多くのフレーバーを使用できることを付け加えておきます。再解析と再計画を回避することに加えて、プリペアドステートメントの大きな利点の1つは、パラメーター値を個別に送信することです。これにより、SQLインジェクションとバグの機会は言うまでもなく、処理するAPIを使用しない場合のエスケープと解析のオーバーヘッドが回避されます。あなたがそれらをエスケープすることを忘れることができない方法でパラメータ。
http://www.postgresql.org/docs/9.1/static/protocol-flow.html
名前付きプリペアドステートメントオブジェクトのクエリプランニングは、解析メッセージが処理されるときに発生します。クエリが異なるパラメータで繰り返し実行される場合は、パラメータ化されたクエリを含む単一の解析メッセージを送信し、その後に複数のバインドおよび実行メッセージを送信すると便利な場合があります。これにより、実行ごとにクエリを再計画する必要がなくなります。
名前のないプリペアドステートメントは、Parseメッセージでパラメーターが定義されていない場合、Parse処理中に同様に計画されます。ただし、パラメーターがある場合は、バインドパラメーターが指定されるたびにクエリプランニングが実行されます。これにより、プランナーは、一般的な見積もりを使用するのではなく、各バインドメッセージによって提供されるパラメーターの実際の値を利用できます。
したがって、DBインターフェースがそれをサポートしている場合は、名前のないプリペアドステートメントを使用できます。これは、クエリと通常のプリペアドステートメントの中間点です。
PHPをPDOで使用する場合、PDOのプリペアドステートメントの実装は、名前付きのプリペアドステートメントを使用するため、postgresにはあまり役に立ちませんが、prepare()を呼び出すたびに再準備されるため、プランのキャッシュは行われません。したがって、両方の中で最悪の事態が発生します。多くのラウンドトリップとパラメータなしの計画です。postgresオプティマイザーが最適なプランを作成するためにパラメーターを実際に知る必要がある特定のクエリでは、pg_query()およびpg_query_params()よりも1000倍遅いことがわかりました。pg_queryは生のクエリを使用し、pg_query_paramsは名前のないプリペアドステートメントを使用します。通常、一方は他方よりも高速ですが、これはパラメータデータのサイズによって異なります。