パラメータ化されたビュー機能を実装するためにOracleでPipelied Table関数を使用するための警告?
-
12-11-2019 - |
質問
常にQueriesで述べる述部を正しく奨励するために、Oracleの通常のビューを介して一部の「パラメータ化ビュー」をレイヤーにすることを決定しました。
繰り返しコードの大部分(適切に結合されたテーブル)はビューにありますので、一般的な結合やフィルタの独自のコピーを使用してさまざまな手順や機能がなくなります。
それから私達はそれらのビューを介してパイプラインテーブルの機能をレイヤーして、発呼者が必要なフィルタを提供するので、ビューは「全ての時間と空間で」と呼ばれないようにする。私はsys_contextとuserenvおよびパッケージ変数を使って代替案を見ました。そして、彼らは、Oracleユーザーがパラメータ化されたビューを呼び出すことが単に使用されるたびにビューの周りにシムを持つように実行可能ではなく、自己結合
スタックオーバーフローを含むさまざまな場所でこれについて読みました:
Oracle 11gの表貴方の関数? (パラメータ化ビュー)
内部の選択パイプラインPL / SQLテーブル機能が許可されていますか?
これは、多くの繰り返しのクエリでスプレーされたアプリケーションの保守性を向上させることを試みるためのアーキテクチャ決定です。ビューは手助けをするために何らかの方法で行くだろうが、私たちが彼らが愚かなことをすることを止めるために発信者に述べた述語を執行する方法がないことを心配しています。
インラインテーブル値の関数を持つSQL Serverでこのテクニックを使用して大成功を収めました。 )より少ないコードとB)より再利用と繰り返しが少ない。
私はその最後のリンクについて少し心配しています、私がこれらのパイプラインテーブル関数の1つに参加して別のテーブルを更新するためにそれを使うならば、私が並行性またはタイミングの問題があるかもしれないことを意味するようです。
パイプラインテーブル関数であなたの経験を共有してください。より良い選択肢があるならば、あなたもあなたの答えで知らせてください。
解決
はい、パイプライン関数内のテーブルを照会するポイントインタイム動作は、テーブルの直接またはビューを介してテーブルの照会とは異なり、考慮する必要があります。つまり、パイプライン関数がまれに更新されたテーブルに照会されている場合、通常は問題ではありません。並行性やタイミングの問題を考えることはできませんが。
私の主な問題は、開発者に(ビューを使用するのとは対照的に)使用するためのパイプライン関数を提供することに関する私の主な問題は、それらが(いくつかのビューと同様に)誤用されるかもしれないということです。開発者は、1つのパイプライン関数の結果を別のパイプライン関数の結果に参加することを選択し、その結果、インデックス、プッシュされた述語、およびテーブルの制約のようなものを利用できない非常に非効率的なクエリがあります。
メンテナンス性があなたの主な問題であるならば、私はビューを好むでしょう - 彼らは一箇所で共通の変換を定義することによって重複したコードを減らすのを助けることができます。しかし、これらも簡単すぎる(例えば、元のクエリでは必要とされない別のテーブルに結合しても、ビューに参加させる)。
性能と効率は、おそらく気にすることです。アプリケーション内のすべてのSQLのために厳格なレビュー体制を適所に置くことができないクエリや矛盾するクエリを探します。