マテリアライズドビューを介して事前にいくつかの結合を実行することにより、高速化しようとしているこの非常に厄介なビューがあります。私の問題は、最も高価な結合であるため、事前に実行する価値が最も高く、具体化されたビューでうまく機能しないことです。
アプリケーションの目標は、可能な限り最新のデータを提供することです。そのため、マット ビューを作成する場合は、コミット時にすばやく更新する必要があります (おそらく、私が知らない他のアプローチは考えていません)。高速リフレッシュには制限があります。具体的には、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を検討しましたが、ロジックを正しく理解できません。ROWNUM
MAX()
編集:オンデマンドで更新を行い、集計を完全に削除しても(正確に1行あると仮定して)、高速更新MVがカードに含まれているかどうかはわかりませんが、オラクルはクエリが複雑すぎて高速更新できないと言っています。だから、今、私は他のアイデアが必要です...