PostgreSQL9.2での更新
大きな改善がありました。
PostgreSQL9.1以前の元の回答
plpgsql関数には、PREPARE
と同様の効果があります。 ステートメント:クエリが解析され、クエリプランがキャッシュされます。
利点は、呼び出しごとにいくらかのオーバーヘッドが節約されることです。
欠点は、クエリプランが呼び出される特定のパラメータ値に対して最適化されないことです。
データ分散が均等なテーブルに対するクエリの場合、これは通常問題なく、PL/pgSQL関数は生のSQLクエリまたはSQL関数よりもいくらか高速に実行されます。ただし、クエリでWHERE
の実際の値に応じて特定のインデックスを使用できる場合 句、またはより一般的には、特定の値に対してより適切なクエリプランを選択すると、最適ではないクエリプランになってしまう可能性があります。 SQL関数を試すか、 EXECUTE
呼び出しごとにクエリを強制的に再計画します。次のようになります:
CREATE OR REPLACE FUNCTION pie(id_param integer)
RETURNS SETOF record AS
$BODY$
BEGIN
RETURN QUERY EXECUTE
'SELECT *
FROM table_name
where id = $1'
USING id_param;
END
$BODY$
LANGUAGE plpgsql STABLE;
コメント後に編集:
このバリアントが実行時間を変更しない場合は、見逃した、または言及しなかった可能性のある他の要因が関係している必要があります。別のデータベース?異なるパラメータ値?詳細を投稿する必要があります。
マニュアルから