PostgreSQL 8.0.0 文書
前のページ | 巻戻し |  | 早送り | 次のページ

# PREPARE

## 名前

PREPARE -- 実行する文の準備

## 概要

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

## 説明

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

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

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

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

## パラメータ

`plan_name`

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

`datatype`

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

`statement`

  `SELECT`、`INSERT`、`UPDATE`、`DELETE`文のいずれかです。

## 注釈

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

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

## 例

`INSERT`文用の準備された文を作成し、実行します。

    PREPARE fooplan (int, text, bool, numeric) AS
        INSERT INTO foo VALUES($1, $2, $3, $4);
    EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);

`SELECT`文用の準備された文を作成し、実行します。

    PREPARE usrrptplan (int, date) AS
        SELECT * FROM users u, logs l WHERE u.usrid=$1 AND u.usrid=l.usrid
        AND l.date = $2;
    EXECUTE usrrptplan(1, current_date);

## 互換性

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

## 関連項目

DEALLOCATE, EXECUTE

前のページ | ホーム | 次のページ
NOTIFY | 上に戻る | REINDEX