誰かが違いを要約してください:
http://www.postgresql.org/docs/9.1/static/xfunc-sql.html
そして
http://www.postgresql.org/docs/9.1/static/plpgsql.html
?
主なポイント:
PL/PgSQLとプレーンSQL関数はどちらもより大きなツールセットの一部であり、そのコンテキストで表示する必要があります。私はそれを、複雑さとコストの上昇と一致する力の昇順のスケールで考える傾向があります。そこでは、うまく機能する最も単純なツールを使用する必要があります。
LISTEN
とNOTIFY
を使用して通信します。機能が必要だと思うときは、非常に頻繁にビューで十分です。ビュー全体をSELECT
するのに非常にコストがかかる場合でも、通常、ビューを参照するクエリのWHERE
句はビューにプッシュダウンされ、クエリプランが大きく異なる可能性があります。 SQL関数をビューに変換することで、パフォーマンスが大幅に向上しました。
ビューを使用できず、SQL関数を検討する必要があるのは、主に次の場合です。
WHERE
式内のパラメーターのように、単純なWITH
句として表現できないパラメーターが必要ですSECURITY DEFINER
関数を介したセキュリティバリアが必要であり、PostgreSQL 9.2以降のsecurity_barrier
ビューではニーズに対応できません。これらのタスクのほとんどでは、プレーンなSQL関数が適切に機能し、多くの場合PL/PgSQLよりも読みやすくなっています。 STABLE
またはIMMUTABLE
として宣言された(およびSTRICT
またはSECURITY DEFINER
としても宣言されていない)SQL関数も、呼び出しステートメントにインライン化できます。これにより、関数呼び出しのオーバーヘッドが取り除かれ、呼び出し側関数のWHERE条件がオプティマイザによってSQL関数にプッシュダウンされると、パフォーマンスが大幅に向上する場合があります。タスクに十分な場合は常にSQL関数を使用します。
SQL関数が機能しない主なタイミングは、多くのロジックが必要な場合です。 CASE
ステートメントとして表現できないif/then/else操作、計算結果の再利用、チャンクからの値の構築、エラー処理など。PL/ PgSQLが便利です。次のように、SQL関数を使用できない場合、または関数が適切でない場合は、PL/PgSQLを選択します。
EXECUTE
ステートメントによる動的SQLおよび動的DDLRAISE
エラー/警告が必要な場合EXCEPTION
ブロックでエラーをトラップして処理できますCASE ... WHEN
にうまく適合しない複雑な条件付きロジックWITH
およびCTEに適合できない計算値の再利用が多い共通テーブル式(CTE)、特に書き込み可能なCTEとWITH RECURSIVE
を使用すると、SQLの方がはるかに表現力があり強力なので、以前よりPL/PgSQLを使用する方がはるかに少ないことがわかります。私はビューとプレーンSQL関数をより多く使用しています。プレーンSQL関数には複数のステートメントを含めることができることに注意してください。最後のステートメントは関数の結果です。
plpgsql
は、変数、ループ構造などを備えた本格的な手続き型言語です。SQL
関数は、単なるサブクエリです。 SQL関数は、STABLE
またはIMMUTABLE
として宣言され、STRICT
としても宣言されていない場合、呼び出しクエリにinlinedとなることがよくあります。各参考文献に記載されていました。