マテリアライズド・ビューのリフレッシュ方法の説明

12952 ワード

マテリアライズドビューでは、3つの異なるリフレッシュ方法を選択し、必要に応じて異なるリフレッシュ方法を選択できます.
  • Completeリフレッシュ:テーブル内のすべてのレコードが削除され(単一テーブルリフレッシュの場合はTruncate方式が使用される場合があります)、マテリアライズド・ビューのクエリ文の定義に基づいてマテリアライズド・ビューが再生成されます.
  • Fastリフレッシュ:インクリメンタルリフレッシュのメカニズムを使用して、前回のリフレッシュ以降にベーステーブルに対して行ったすべての操作をマテリアライズドビューにリフレッシュします.
  • Forceリフレッシュ:Oracleは、Fastリフレッシュ条件が満たされているかどうかを自動的に判断し、満たされている場合はFastリフレッシュを行い、そうでない場合はCompleteリフレッシュを行います.

  • すべてのマテリアライズド・ビューがFastリフレッシュできるわけではありません.いくつかの条件を満たすマテリアライズド・ビューだけがFastリフレッシュの能力を持っています.クエリーによっては、Fastリフレッシュの制限条件が異なります.次に、Fastリフレッシュの異なるタイプの物体化ビューに対する制限条件についてまとめます.
  • 1.すべてのタイプの高速リフレッシュマテリアライズドビューが満たす必要がある条件:
  • マテリアライズドビューは、SYSDATEおよびROWNUMのような不確定な式への参照を含んではならない.
  • マテリアライズドビューには、LONGおよびLONG RAWデータ型への参照は含まれません.

  • 2.複数のテーブル関連のみを含む物体化ビューに対する制約:
  • は、すべての高速リフレッシュ物体化ビューが満たす条件を満たさなければならない.
  • は、GROUP BY文または集約動作を含んではならない.
  • WHERE文に外部ジョインが含まれている場合、一意の制約はジョイン内のテーブルのジョイン列に存在する必要があります.
  • 外部接続が含まれていない場合、WHERE文に制限はありません.外部接続が含まれている場合、WHERE文ではAND接続のみが使用され、「=」操作のみが使用されます.
  • FROM文リスト内のすべてのテーブルのROWIDがSELECT文のリストに表示される必要があります.
  • FROM文リストのすべてのテーブルは、ROWIDタイプに基づくマテリアライズド・ビュー・ログを確立する必要があります.


  • 例:
    1                ,           : SQL> create materialized view log on dim_a with rowid;  SQL> create materialized view log on dim_b with rowid;  SQL> create materialized view log on fact with rowid;  SQL> create materialized view mv_fact refresh fast on commit as 2 select f.rowid f_rowid, a.rowid a_rowid, b.rowid b_rowid, f.id, 3 a.name a_name, b.name b_name, num 4 from fact f, dim_a a, dim_b b 5 where f.aid = a.id 6 and f.bid = b.id; 
  • 3.集合物化ビューに対する制約:
  • は、すべての高速リフレッシュ物体化ビューが満たす条件を満たさなければならない.
  • マテリアライズド・ビュー・クエリのすべてのテーブルは、マテリアライズド・ビュー・ログを確立する必要があります.マテリアライズド・ビュー・ログは、
  • という制限を満たす必要があります.
  • は、マテリアライズド・ビュー・クエリー・ステートメントのすべてのカラムを含み、SELECTリストのカラムとWHEREステートメントのカラムを含む.
  • は、ROWIDおよびINCLUDING NEW VALUESを示す必要がある.
  • 基本的な動作に対してINSERT、UPDATE、およびDELETE動作が同時に含まれる場合(すなわち、INSERT操作のみが含まれるわけではない)、マテリアライズド・ビュー・ログにはSEQUENCEが含まれるべきである.
  • によって許可される集合関数は、SUM、COUNT、AVG、stdDEV、VARIANCE、MIN、MAXを含む.
  • はCOUNT(*)を指定しなければならない.
  • COUNT以外の集計関数が示されている場合、COUNT(expression)も存在しなければならない.例えば、SUM(a)を含む場合は、COUNT(a)を同時に含む必要があります.
  • VARIANCE(expression)またはstdDEV(expression)が示されている場合、COUNT(expression)のほか、SUM(expression)も示さなければならない.Oracle推奨にはSUM(expression*expression)も含まれます.
  • SELECTリストにはすべてのGROUP BY列が含まれなければならない.
  • マテリアライズド・ビューが以下の状況に属する場合、高速リフレッシュは従来のDML挿入および直接マウントのみをサポートし、このタイプのマテリアライズド・ビューはINSERT-ONLYマテリアライズド・ビューとも呼ばれる.
  • 物体化ビューは、MINまたはMAX集合関数を含む.
  • 物体化ビューはSUM(expression)を含むが、COUNT(expression)は含まれていない.
  • マテリアライズドビューにはCOUNT(*)は含まれていません.
  • 注意:このような物体化ビューが確立され、リフレッシュ機構がON COMMITである場合、潜在的な問題がある.UPDATE文またはDELETE文が表示された場合、手動で完全にリフレッシュしてこの問題を解決しない限り、マテリアライズド・ビューは自動的にリフレッシュされず、エラーは報告されません.

  • inline views、outer joins、self joinsまたはgrouping setが含まれている場合、互換性の設定は9.0以上でなければなりません.
  • マテリアライズドビューがビューまたはサブクエリに確立されている場合、ビューが完全にマージされる必要があります.
  • 外部接続がない場合、WHERE文に制限はありません.外部ジョインが含まれている場合、WHERE文にはANDジョインと"="アクションのみが含まれていることが要求されます.外部接続を含む集計物化ビューの場合、outerテーブルの変更をサポートするクイックリフレッシュを行います.interテーブルの接続列に一意の制約がある必要があります.
  • ROLLUP、CUBE、GROUPING SETを含む物体化ビューについては、以下の制限条件を満たす必要があります.
  • SELECT文リストには、GROUPING識別子が含まれている必要があります.GROUP BY式のすべての列のGROUPING_ID関数は、GROUP BY式の各列のGROUPING関数であってもよい.例えば、GROUP BY文がGROUP BY CUBE(a,b)である場合、SELECTリストにはGROUPING_が含まれるべきであるID(a,b)またはGROUPING(a)およびGROUPING(b)である.
  • GROUP BYは重複するGROUPINGを生成できない.例えば、GROUP BY a、ROLLUP(a,b)は、重複するGROUPING:(a)、(a,b)、(a)を含むため、高速リフレッシュをサポートしない.



  • 例:
    1              ,           : SQL> create materialized view log on fact with rowid, sequence (aid, num) 2 including new values;  SQL> create materialized view mv_fact refresh fast on commit as 2 select aid, count(*) count, count(num) count_num, sum(num) sum_num 3 from fact group by aid;  2          ,           : SQL> create materialized view log on fact with rowid, sequence (aid, num) 2 including new values;  SQL> create materialized view log on dim_a with rowid, sequence (id, name) 2 including new values;  SQL> create materialized view mv_fact refresh fast on commit as 2 select name, count(*) count, count(num) count_num, sum(num) sum_num 3 from fact, dim_a where aid = dim_a.id group by name; 
  • 4.ユニオンALLを含む物化ビューに対する制限条件
  • UNIOALLオペレーションは、クエリの最上位レベルにある必要があります.例外として、UNIOALLは第2層にあり、第1層のクエリ文はSELECT*FROMである.
  • UNIOALL操作によって接続された各クエリーブロックは、高速リフレッシュの制限条件を満たすべきである.
  • SELECTリストには、UNIOALL識別子と呼ばれるメンテナンス列が含まれている必要があります.UNIOALLブランチの識別子列ごとに異なる定数値が含まれている必要があります.
  • では、外部接続、リモート・データベース・テーブル、および挿入のみが許可される集約マテリアライズド・ビュー定義クエリーはサポートされていません.
  • は、パーティション変更追跡(PCT)に基づくリフレッシュをサポートしない.
  • データベースの互換性設定は9.2.0に設定してください.


  • 例:
    1UNION ALL     SQL> create materialized view log on dim_a with rowid;  SQL> create materialized view log on dim_b with rowid;  SQL> create materialized view log on fact with rowid;  SQL> create materialized view mv_fact refresh fast on commit as 2 select f.rowid f_rowid, a.rowid row_id, a.name name, num, 'a' marker 3 from fact f, dim_a a 4 where f.aid = a.id 5 union all 6 select f.rowid f_rowid, b.rowid row_id, b.name name, num, 'b' marker 7 from fact f, dim_b b 8 where f.bid = b.id; 
  • 5.ネストされた物体化ビューに対する制限条件
  • ネストされた物体化ビューの各層は、高速リフレッシュの制限条件を満たさなければならない.
  • 集計と接続を同時に含むネストされたマテリアライズドビューでは、ON COMMITの高速リフレッシュはサポートされていません.


  • 例:
    SQL> create materialized view log on dim_a with rowid;  SQL> create materialized view log on dim_b with rowid;  SQL> create materialized view log on fact with rowid;  SQL> create materialized view mv_fact refresh fast on commit as 2 select f.rowid f_rowid, a.rowid a_rowid, b.rowid b_rowid, f.id, 3 a.name a_name, b.name b_name, num 4 from fact f, dim_a a, dim_b b 5 where f.aid = a.id 6 and f.bid = b.id;  SQL> create materialized view log on mv_fact with rowid, sequence (a_name, num) 2 including new values;  SQL> create materialized view mv_mv_fact refresh fast on commit as 2 select a_name, count(*) count, count(num) count_num, sum(num) sum_num 3 from mv_fact 4 group by a_name;