PREPARE

名前

PREPARE -- 実行する文の準備

概要

PREPARE plan_name [ (datatype [, ...] ) ] AS statement

説明

PREPARE は準備された文を作成します。 準備された文は、性能の最適化に利用できるサーバ側オブジェクトです。 PREPARE 文を実行すると、指定された問い合わせが構文解析され、書き換えられ、そして計画が作成されます。 その後に EXECUTE 文が発行されると、準備された文は実行されるのみです。 このようにすると、構文解析、書き換え、そして計画は一度だけ行えば良く、問い合わせが実行される度に行う必要がなくなります。

準備された文はパラメータ、すなわち文が実行されるときに代入される値を取ることができます。 準備された文にパラメータを指定するには、PREPARE 文にデータ型のリストを含めます。 問い合わせ自体では、$1$2 などを使用した位置によってパラメータを参照します。 文の実行時には、EXECUTE 文内にこれらのパラメータの実際の値を指定します。 詳細については EXECUTE を参照してください。

準備された文は現在のデータベースセッションで、そのセッション期間中にのみ保持されます。 セッションが終了すると、準備された文は破棄されます。そのため、再利用する前に作成し直す必要があります。 また、これは1つの準備された文を複数のデータベースクライアントから使用することができないことを意味します。 しかし、各クライアントは独自に準備された文を作成することはできます。

準備された文の利点を最大限に発揮できるのは、単一のセッションで多数の同類の問い合わせを実行する場合です。 パフォーマンスの違いは、文の計画や書き換えが複雑なほど顕著になるでしょう。 例えば、問い合わせで多数のテーブルが結合されている場合、あるいはいくつものルールを適用しなければならない場合などです。 文の計画および書き換えは比較的単純だが実行のコストが比較的高いという場合には、準備された文の利点はさほど目立たないでしょう。

パラメータ

plan_name

特定の準備された文に与えられる任意の名前です。 この名前は、1 つのセッション内で一意である必要があり、この後の準備された文の実行および削除に使用されます。

datatype

準備された文に対するパラメータのデータ型です。 準備された文自体の中でこのパラメータを参照するには、$1$2 などを使用します。

statement

SELECTINSERTUPDATEDELETE 文のいずれかです。

注釈

状況によっては、準備された文用に生成された問い合わせ計画は、普通に送信され実行された場合の計画よりも劣ってしまう場合があります。 これは、文の計画を作成し、プランナが最適な問い合わせ計画を判断する際、文の中でパラメータに指定された実際の値を使用できないことが原因です。 PostgreSQL はテーブル内のデータ分布に関する統計を集め、そして定数を使用することで問い合わせの実行結果を予測することができます。 パラメータを持つ準備された文を計画する際にこのデータを使用できないため、選択される計画は最適ではない可能性があります。 PostgreSQL が準備された文に対して選択した問い合わせ計画を検査するには、EXPLAIN EXECUTE を使用してください。

問い合わせの計画、および問い合わせの最適化のために PostgreSQL が収集する統計に関する詳細は ANALYZE の文書を参照してください。

互換性

標準SQL には PREPARE 文が含まれていますが、これは埋め込み SQL でのみ使用できます。 また、このバージョンの PREPARE 文では多少異なる構文が使用されます。