マテリアライズド・ビューのリフレッシュを行う場合に、データを提供するリモート・インスタンスでどのような操作が行われるかを確認するため SQL 文のトレースを取得してみました。ただしこれらの動作はマテリアライズド・ビューや、マテリアライズド・ビュー・ログの作成オプションによって変化します。
準備
データ・ソース側でテーブルを作成します。マテリアライズド・ビュー・ログは、デフォルト設定で作成します。
SQL> CREATE TABLE mtest1(c1 NUMBER PRIMARY KEY, c2 VARCHAR2(10));
表が作成されました。
SQL> INSERT INTO mtest1 SELECT LEVEL c1, 'data1' c2 FROM DUAL CONNECT BY LEVEL <= 100000;
100000行が作成されました。
SQL> COMMIT;
コミットが完了しました。
SQL> CREATE MATERIALIZED VIEW LOG ON mtest1;
マテリアライズド・ビュー・ログが作成されました。
リモート・インスタンスでマテリアライズド・ビューを作成します。差分リフレッシュができるように、REFRESH FAST 句を指定します。
SQL> CREATE MATERIALIZED VIEW mview1 REFRESH FAST AS SELECT * FROM mtest1@link1;
マテリアライズド・ビューが作成されました。
元テーブルに1件のレコードを格納し、マテリアライズド・ビューとの差分を作ります。
SQL> INSERT INTO mtest1 VALUES (0, 'add');
1行が作成されました。
SQL> COMMIT;
コミットが完了しました。
マテリアライズド・ビューの高速リフレッシュを実行し、データ・ソース側インスタンスで SQL 文のトレースを取得します。
SQL> EXEC DBMS_MVIEW.REFRESH('MVIEW1', 'f');
PL/SQLプロシージャが正常に完了しました。
トレース結果
実行された SQL 文のうち、情報が更新される SQL 文をいくつか紹介します。
テーブル定義の更新します(用途は不明)。
update tab$ set spare3 = :1, spare5 = :3
where
obj# = :2
マテリアライズド・ビュー・ログ内のレコードに対して更新時刻をアップデートしています。
update "SCOTT"."MLOG$_MTEST1" set snaptime$$ = :1
where
snaptime$$ > to_date('2100-01-01:00:00:00','YYYY-MM-DD:HH24:MI:SS')
マテリアライズド・ビューの更新時刻をアップデートします。SYS.MLOG$ テーブルはマテリアライズド・ビュー・ログの情報を格納しています。その他にいくつかの用途不明のテーブルを更新します。
update sys.mlog$ set youngest = :1, yscn = :2
where
mowner = :3 and master = :4
UPDATE sys.snap_loadertime$ SET youngest = :1
WHERE
tableobj# = :2
update sys.sumpartlog$ s set s.timestamp = :1, s.scn = :2
where
s.bo# = :3 and s.timestamp >= to_date('4000-01-01:00:00:00',
'YYYY-MM-DD:HH24:MI:SS')
マテリアライズド・ビューの情報を更新します。SYS.SLOG$ テーブルはデータベース内のテーブルに対して作成されたマテリアライズド・ビューの情報が格納されます。DBA_REGISTERED_MVIEWS ビューの元になるテーブルです。
update sys.slog$ set snaptime = :1, tscn = :2
where
snapid = :3 and mowner = :4 and master = :5
不要になったマテリアライズド・ビュー・ログ内のレコードを削除します。複数のマテリアライズド・ビューがテーブルを参照している場合は、すべてのマテリアライズド・ビューがリフレッシュされるまで削除されない場合があります。
delete from "SCOTT"."MLOG$_MTEST1"
where
snaptime$$ <= :1
最後にマテリアライズド・ビュー・ログの情報を更新します。
update sys.mlog$ set oldest = :1, oldest_pk = :2, oldest_oid = :3,
oldest_new = :4, youngest = :5, oldest_seq = :6, last_purge_date = sysdate,
last_purge_status = 0, rows_purged = :9, purge_job = :10