「survey」と「survey_processed」の 2 つのテーブルがあり、どちらも基本的に類似したテーブルです。2 つのテーブル間で UNION ALL 演算子を使用する作業クエリがあり、いくつかのカウントを取得しています。マテリアライズド ビューに変換しようとすると、ON COMMIT に関連するエラーが発生します。以下の MV DDL とエラーを確認してください。
マテリアライズド ビューの作成 vwm_survey_records_count コミット時にすばやくリフレッシュ なので 選択する survey_combined.survey_header_id, COUNT(*) AS count_total, COUNT(CASE WHEN survey_combined.processed_flag = 'Y' THEN 1 ELSE NULL END) AS count_a, COUNT(CASE WHEN survey_combined.approved_flag IS NULL THEN 1 ELSE NULL END) AS count_b, COUNT(CASE WHEN survey_combined.processed_flag = 'N' AND survey_combined.approved_flag = 'Y' THEN 1 ELSE NULL END) AS count_c, COUNT(CASE WHEN survey_combined.approved_flag = 'N' THEN 1 ELSE NULL END) AS count_d から ( SELECT survey_header_id, 'N' ASprocessed_flag, approval_flag FROM 調査 ユニオンオール SELECT 調査_ヘッダー_ID、'Y' AS 処理済みフラグ、調査_処理済みの承認済みフラグ) 調査_結合 INNER JOIN survey_header ON survey_combined.survey_header_id = survey_header.id GROUP BY survey_combined.survey_header_id;
上記のコマンドを実行すると、
「SQL エラー: ORA-12054: マテリアライズド ビューの ON COMMIT 更新属性を設定できません」というエラーが表示されます。
しかし、「REFRESH COMPLETE ON DEMAND」を使用すると機能します。ON COMMIT 属性のいくつかの制限を明らかに破っていることは知っていますが、どれがわかりません。誰かが上記のクエリで何が間違っているのか教えてもらえますか? また、MVの作成中にクエリを効率化し、「REFRESH FAST ON COMMIT」で動作させるためのより良いアプローチはありますか。
注: 選択した列で行 ID を使用して、両方のテーブルに対して MV ログを作成しました。
ご不明な点がございましたらお知らせください。
前もって感謝します。
「jonearles」によって要求された MV ログの DDL は次のとおりです。
CREATE MATERIALIZED VIEW LOG ON survey WITH SEQUENCE,ROWID (id, survey_header_id, approval_flag,processed_flag) INCLUDING NEW VALUES; CREATE MATERIALIZED VIEW LOG ON survey_processed WITH SEQUENCE,ROWID (id, survey_header_id, approval_flag) INCLUDING NEW VALUES; CREATE MATERIALIZED VIEW LOG ON survey_header WITH SEQUENCE,ROWID (id) INCLUDING NEW VALUES;
注: 「survey」テーブルの列「processed_flag」は後で削除されます。技術的には、2 つのテーブルは最近、「processed_flag」列の値に基づいて分割されました。したがって、「survey」テーブルにはすべての未処理のレコード (processed_flag = 'N') があり、「survey_processed」には処理済みのレコード (processed_flag = 'Y') があります。分割後、列は無関係です。