質問を逆の順序で行うには
FAST 更新は、増分更新とも呼ばれます。それはあなたに違いについての手がかりを与えるはずです。COMPLETE リフレッシュは MVIEW 全体を最初から再構築しますが、FAST リフレッシュはフィーダー テーブルに対して実行された DML からの変更のみを適用します。
FAST リフレッシュを実行するには、適切な MVIEW LOG が必要です。これにより、基礎となるテーブルのデータへの変更が追跡されるため、Oracle は、テーブル全体をクエリするのではなく、マテリアライズド ビューにデルタを効率的に適用できます。
構文に関しては、基本は次のとおりです。
SQL> create materialized view log on emp
2 with rowid, primary key, sequence (deptno, job)
3 including new values
4 /
Materialized view log created.
SQL> create materialized view emp_mv
2 refresh fast on commit
3 as
4 select deptno, job from emp
5 group by deptno, job
6 /
Materialized view created.
SQL>
このON COMMIT
句は、MVIEW がトランザクションごとに更新されることを意味します (ON DEMAND
通常の一括更新ではなく)。このREFRESH
句は、増分リフレッシュまたは完全リフレッシュのどちらを適用するかを指定します。更新の使用を強制するクエリのカテゴリがいくつかありますがCOMPLETE
、これらは Oracle の新しいバージョンごとに減少するようです。
それが機能することを確認するための簡単なテスト...
SQL> select * from emp_mv
2 order by deptno, job
3 /
DEPTNO JOB
---------- ---------
10 MANAGER
10 PRESIDENT
10 SALES
20 ANALYST
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN
40 CLERK
40 DOGSBODY
11 rows selected.
SQL>
新記録どう?
SQL> insert into emp (empno, ename, deptno, job)
2 values (6666, 'GADGET', 40, 'INSPECTOR')
3 /
1 row created.
SQL> commit
2 /
Commit complete.
SQL> select * from emp_mv
2 order by deptno, job
3 /
DEPTNO JOB
---------- ---------
10 MANAGER
10 PRESIDENT
10 SALES
20 ANALYST
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN
40 CLERK
40 DOGSBODY
40 INSPECTOR
12 rows selected.
SQL>
構文の詳細については、SQL リファレンスを参照してください。Data Warehousing Guideの Materialized View の章も読む価値があります。
以下のコメント投稿者の懸念にもかかわらず、これは宣伝どおりに機能します. 残念ながら、デモを公開するための通常の場所 (SQL Fiddle、db<>fiddle) では、具体化されたビューは許可されていません。私は Oracle SQL Live で何かを公開しました (無料の Oracle アカウントが必要です): 私はそれに対する Oracle の承認を待っており、到着したらこの質問を更新します。