無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

PREPARE

名前

PREPARE -- 実行する文を準備する

概要

PREPARE 

name

 [ ( 

data_type

 [, ...] ) ] AS 

statement

説明

PREPARE はプリペアド文を作成します。 プリペアドは、性能を最適化するために利用可能なサーバ側オブジェクトです。 PREPARE 文を実行すると、指定された問い合わせの構文解析、書き換えが行われます。 その後、 EXECUTE 文が発行された際に、プリペアド文は実行計画が作成され、実行されます。 この作業の分割により構文解析作業が繰り返されることを防止でき、さらに、特定のパラメータ値に合わせた実行計画を提供することができます。

プリペアド文はパラメータ、すなわち文が実行される時に代入される値を取ることができます。 プリペアド文を作成する時には $1 $2 などを使用して、位置によりパラメータを参照してください。 省略可能ですが、対応するパラメータのデータ型のリストを指定することもできます。 パラメータのデータ型の指定がない、または、 unknown と宣言されている場合、型はパラメータが使用される文脈より(可能ならば)推測されます。 文の実行時には、 EXECUTE 文内にこれらのパラメータの実際の値を指定します。 詳細は EXECUTE を参照してください。

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

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

パラメータ

name

個々のプリペアド文に与えられる任意の名前です。 この名前は、1つのセッション内で一意でなければいけません。プリペアド文の実行および削除の時に、この名前が使用されます。

data_type

プリペアド文に対するパラメータのデータ型です。 特定のパラメータのデータ型の指定がない、または、 unknown と指定された場合、パラメータが使用される文脈から推測されます。 プリペアド文自体の中でこのパラメータを参照する時は、 $1 $2 などを使用します。

statement

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

注釈

プリペアド文が何度も実行される場合、サーバは最終的に、毎回計画を再作成するのではなく、一般的な計画を保存し再利用することに決定する可能性があります。 プリペアド文がパラメータを持たない場合、これは即座に起こります。 パラメータを持つ場合は、一般的な計画がパラメータ値に合わせた計画に比べて大して高価ではないように見える場合に、これが起こります。 一般化された計画は典型的には、問い合わせの性能が提供された特定のパラメータ値に大きな影響を受けない場合のみに選ばれます。

プリペアド文に対して PostgreSQL が使用する問い合わせ計画を検証するためには、 EXPLAIN を使用してください。 一般的な計画が使用される場合には、 $ n というパラメータ記号が含まれ、独自計画が使用される場合は現在のパラメータの実値で置換されます。

問い合わせの実行計画や問い合わせの最適化のために PostgreSQL が収集する統計に関する詳細は、 ANALYZE のドキュメントを参照してください。

プリペアド文の主要な利点は、文の解析処理と計画作成処理の繰り返しを防止することですが、 PostgreSQL では、以前にそのプリペアド文を使用してから、文の中で使用されているデータベースオブジェクトが定義(DDL)の変更を受けた時は常に再解析処理と計画再作成処理を強制します。 また、一度使用してから search_path の値が変わった場合も、文は新しい search_path を使用して再解析されます。 (後者の振る舞いは PostgreSQL 9.3の時に追加されました。) これらの規則により、プリペアド文の使用は意味的に同じ問い合わせを繰り返し再投入することとほぼ同じになりますが、特に最善の計画が使用している間に変わらずに残る場合、オブジェクトの変更がない場合の性能という利点があります。 意味的な等価性が完全ではない場合の例は、 文が未修飾名によってテーブルを参照し、その後同じ名前のテーブルが新たに search_path 内で前に現れるスキーマ内に作成された場合、文の中で使用されるオブジェクトには変更がありませんので、自動再解析は行われません。 しかし他の何らかの変更により強制的に再解析された場合、その後の使用では新しいテーブルが参照されるようになります。

pg_prepared_statements システムビューを問い合わせることによりセッションで利用可能なプリペアド文をすべて確認することができます。

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) 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);

第2パラメータのデータ型が指定されていないことに注目してください。 このため $2 が使用される文脈からデータ型が推測されます。

互換性

標準SQLには PREPARE 文が含まれていますが、埋め込みSQLでの使用に限られています。 また、標準SQLの PREPARE 文では多少異なる構文が使用されます。

関連項目

DEALLOCATE , EXECUTE

powered by SEO.CUG.NET