1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

マテリアライズド・ビュー・ログを検証する(2)

1
Last updated at Posted at 2020-01-06

マテリアライズド・ビューのリフレッシュを行う場合に、データを提供するリモート・インスタンスでどのような操作が行われるかを確認するため 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
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?