誰でも次の違いを要約してください:
http://www.postgresql.org/docs/9.1/static/xfunc-sql.html
そして
http://www.postgresql.org/docs/9.1/static/plpgsql.html
?
主なポイント:
- 概念的な違い
- 問題の家族、与えられた便利さを考えると
- 政治的な問題
誰でも次の違いを要約してください:
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
関数を介したセキュリティバリアが必要であり、security_barrier
PostgreSQL 9.2以降のビューではニーズに十分ではありません。これらのタスクのほとんどでは、単純な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関数には複数のステートメントを含めることができることを思い出してください。最後のステートメントは、関数の結果です。