postgresql PREPAREの使い方


Name PREPARE--クエリーを作成
Synopsis
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は、テーブル内のデータ分布の統計を収集し、クエリの定数を使用してクエリを実行する可能性のある結果を推測できます.これらのデータは、どのパラメータ付きクエリーの計画を準備する際には入手できないため、選択した計画は劣っている可能性があります.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);