ダイレクトパスの場合マテビューログに記録されないが、なぜ高速リフレッシュが出来る?
人気ブログランキング
次のことをするとダイレクトパスで登録されるので、マテビューログに記録されない。
・SQL*Loaderでダイレクトパスロード
・APPEND/APPEND_VALUES ヒントを付けてINSERT
・PARALLEL DML
MOG$_XXX テーブルの中身を見ると無いのがわかる。
でも、高速リフレッシュすると、ダイレクトパスで入れたデータも反映される。
ALL_MVIEWS の LAST_REFRESH_TYPE も FAST になっている。
V$SQL のSQL_FULLTEXTをテーブル名でフィルタして、LAST_ACTIVE_TIME で DESCでソートしてを見ても、登録した件数だけ実行回数(EXECUTIONS )が増えて、完全リフレッシュのような INSERT INTO SELECTは発行されていない。
HWMの情報を記録していてそれをもとにやっているのかな?と推測してみたが違った(似たような感じだが)
TOMさん のを見ると、ダイレクトパスでロードした情報が ALL_SUMDELTA に記録されていて、それからレコードを特定できるそうだ。
MVのマニュアルを見ると次のように書いてある。
でも、ALL_SUMDELTA で確認できることは書いてないのね。これじゃわからんよOracleさんよ。
じゃあ、MVを作らずにダイレクト・ローダー・ログだけを使う高速リフレッシュができるかというと、それはダメなんだって。
CREATE MATERIALIZED VIEW を見るとエラーになるらしい。
自動的にダイレクト・ローダー・ログが作られるのは良いが、いつ消えるんだろう。
少し調べたがわからなかった。
絵で見てわかるOracleの仕組み 新装版
小田 圭二
翔泳社
2019/3/11
・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
この記事へのコメント