ダイレクトパスの場合マテビューログに記録されないが、なぜ高速リフレッシュが出来る?

人気ブログランキング

次のことをするとダイレクトパスで登録されるので、マテビューログに記録されない。

・SQL*Loaderでダイレクトパスロード
・APPEND/APPEND_VALUES ヒントを付けてINSERT
・PARALLEL DML

MOG$_XXX テーブルの中身を見ると無いのがわかる。

exec DBMS_MVIEW.REFRESH('XXX', 'f');


でも、高速リフレッシュすると、ダイレクトパスで入れたデータも反映される。
ALL_MVIEWS の LAST_REFRESH_TYPE も FAST になっている。
V$SQL のSQL_FULLTEXTをテーブル名でフィルタして、LAST_ACTIVE_TIME で DESCでソートしてを見ても、登録した件数だけ実行回数(EXECUTIONS )が増えて、完全リフレッシュのような INSERT INTO SELECTは発行されていない。

HWMの情報を記録していてそれをもとにやっているのかな?と推測してみたが違った(似たような感じだが)

TOMさん のを見ると、ダイレクトパスでロードした情報が ALL_SUMDELTA に記録されていて、それからレコードを特定できるそうだ。

MVのマニュアルを見ると次のように書いてある。

高速リフレッシュ方法を使用する場合、マスター表に対する変更はマテリアライズド・ビュー・ログまたはダイレクト・ローダー・ログに記録されます。マテリアライズド・ビュー・ログとは、マスター表に定義されているマテリアライズド・ビューの増分リフレッシュを実行できるように、マスター表の変更を記録するスキーマ・オブジェクトです。マテリアライズド・ビュー・ログは、それぞれ1つのマスター表に対応付けられています。マテリアライズド・ビュー・ログは、マスター表と同じデータベースおよびスキーマに格納されます。


でも、ALL_SUMDELTA で確認できることは書いてないのね。これじゃわからんよOracleさんよ。

じゃあ、MVを作らずにダイレクト・ローダー・ログだけを使う高速リフレッシュができるかというと、それはダメなんだって。
CREATE MATERIALIZED VIEW を見るとエラーになるらしい。

REFRESH FASTを指定すると、マテリアライズド・ビューのマスター表のマテリアライズド・ビュー・ログが存在していない場合に、CREATE文は正常に実行されません。ダイレクト・パスINSERTが行われると、ダイレクト・ローダー・ログが自動的に作成されます。手動での操作は必要ありません。


自動的にダイレクト・ローダー・ログが作られるのは良いが、いつ消えるんだろう。
少し調べたがわからなかった。

絵で見てわかるOracleの仕組み 新装版
小田 圭二
翔泳社
2019/3/11

この記事へのコメント