Oracle10g マテリアライズド・ビュー(ノウハウ)

意味はさておき作成したい人はこちら

って何よ?

「実体」のある表。データウェアハウスやレプリケーションに利用される。元ネタ表の事を「マスタ表」と呼ぶ。

マテリアライズド・ビューとは、ある一時点におけるターゲット・マスターのレプリカのことです。


マテリアライズド・ビューの作成に必要な権限

  • CREATE MATERIALIZED VIEW(マテビューを作成するスキーマに対して)
  • CREATE TABLE, CREATE VIEW, CREATE INDEX(マテビューを所持するスキーマに対して)

以下は、他スキーマのテーブルをマスタ表にする場合

  • その表に対するSELECT権限
  • その表に対するON COMMIT REFRESH権限(ON COMMIT REFRESH句を使用する場合)


CREATE文

CREATE MATERIALIZED VIEW
  マテリアライズド・ビュー名
REFRESH
   リフレッシュ方法 リフレッシュ・モードおよびリフレッシュ時刻
AS サブクエリ

REFRESH句を指定しなければ、自動リフレッシュされない。
更新可能マテリアライズド・ビューを作成するには、"AS"の前に"FOR UPDATE"を指定する。


リフレッシュ方法

FAST 高速リフレッシュ方法。差分のみ更新。マテリアライズド・ビュー・ログを使用するので、このログが存在していない場合には、CREATE文は正常に実行されない。事前に作成する。
COMPLETE 完全リフレッシュ方法。
FORCE デフォルト値。実行時に可能ならば、高速リフレッシュ方法を採用する。不可能ならば完全リフレッシュ方法を採用する。

マスタが「テーブル」「マテビュー」の場合→高速リフレッシュ可能
マスタが「シノニム」「ビュー」の場合→高速リフレッシュ不可。完全リフレッシュのみ。


リフレッシュ・モード

ON COMMIT 自動リフレッシュ。マスタ表のコミットにあわせてリフレッシュ。処理速度は落ちる。
ON DEMAND デフォルト。手動リフレッシュ。
DBMS_MVIEW.REFRESH(ビュー名)またはREFRESH_ALL_MVIEWS()


リフレッシュ時刻

リフレッシュ・モードと同時に指定はできない。

START WITH 最初の自動リフレッシュ時刻を表す日時式。NEXT指定がない場合、マテビューは1回だけリフレッシュされる。
NEXT 自動リフレッシュの間隔を計算するための日時式。START WITH指定がない場合、現在時刻+NEXT時刻を自動的に算出し、自動リフレッシュされる。

日を単位として、時間を制限するすべてのパラメータに対して、分数で日数を指定できる。たとえば、1時間は1/24、5分は1/288、1分は1/1440になる。
例)
NEXT SYSDATE + 1/288
→5分間隔でリフレッシュ。


手動リフレッシュ

  • EXEC DBMS_MVIEW.REFRESH('マテビュー名')
  • VARIABLE a NUMBER;←変数aは必須引数の失敗件数。
     EXEC DBMS_MVIEW.REFRESH_ALL_MVIEW(:a);


"*"の罠

  • 普通のVIEWもそうなのだが、マスタ表の方を「ALTER TABLE 〜」すると、リフレッシュをかけてもALTERの結果は反映されない。「SELECT * 〜」と書いても駄目である。この場合はマテビューを再作成するしかない。


マテビューの再作成

  • CERATE OR REPLACE〜がないため、DROP&再CREATEする。


マテビューとUNDO表領域

  • リフレッシュにはUNDO表領域を使用する。このため、大量データを頻繁にリフレッシュする設定にしていると、UNDO表領域がすぐにいっぱいになってしまう。(もし自動エクステンドONだったりすると、恐ろしい光景が見られます)