2

マテリアライズドビューを介して事前にいくつかの結合を実行することにより、高速化しようとしているこの非常に厄介なビューがあります。私の問題は、最も高価な結合であるため、事前に実行する価値が最も高く、具体化されたビューでうまく機能しないことです。

アプリケーションの目標は、可能な限り最新のデータを提供することです。そのため、マット ビューを作成する場合は、コミット時にすばやく更新する必要があります (おそらく、私が知らない他のアプローチは考えていません)。高速リフレッシュには制限があります。具体的には、ROWID が必要です。こちらのスレッドを参照してください。しかし、結合の性質上、正しいレコードを取得するには結合を集約する必要があるため、私の問題は少し異なります。

これが私が「事前実行」したいものです(または別の天才的な方法で最適化します):

     CREATE MATERIALIZED VIEW testing
     NO LOGGING
     CACHE
     BUILD IMMEDIATE
     REFRESH FAST ON COMMIT 
     AS
       SELECT br.id, br.rowid, max(mr.id) as modifier_id --somehow fit mr.rowid in here
        FROM tableA br --base record
        LEFT OUTER JOIN tableA mr --modifier record
            ON br.external_key = mr.external_key
            AND mr.record_type_code in ('SOME','TYPE')
            AND mr.status_code in ('SOME','STATUS');

0-*n*基本的に、エンティティに変更が加えられ、そのすべてが同じテーブルの後続の行で行われるため、これは自己結合です。特定のタイプの最新のものを選択しています。(他のタイプではこれを追加で行います)。上記を機能させるには、br と mr の両方の rowid を含める必要があります。w/ で集計する代わりにrank()andを検討しましたが、ロジックを正しく理解できません。ROWNUMMAX()

編集:オンデマンドで更新を行い、集計を完全に削除しても(正確に1行あると仮定して)、高速更新MVがカードに含まれているかどうかはわかりませんが、オラクルはクエリが複雑すぎて高速更新できないと言っています。だから、今、私は他のアイデアが必要です...

4

2 に答える 2

1

あなたの状況には当てはまらないかもしれませんが、テーブルを非正規化できる可能性があります。

たとえば、複数の言語に依存する名前がある場合、言語ごとに列に名前を付けることができます。

たとえば、アクセスがインデックス ベースの場合は、varrayまたはを検討してくださいnested tables

別のアイデアは、トリガーを使用することです。挿入/更新/削除時に、別のテーブル (またはテーブル) を更新し、そのテーブルをクエリに使用します。おそらく、この方法で集計を事前に計算することもできます。

于 2013-06-05T09:12:51.410 に答える
0

具体化されたビューを使用して集計のみを行うことを検討するので、EXTERNAL_KEY と MAX(ID) を格納するだけです。

マスター テーブルで削除が発生している場合は、count(*) も含めます。

これにより、高速リフレッシュ機能が提供されます。

于 2013-06-05T10:08:00.053 に答える