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だったりすると、恐ろしい光景が見られます)
参考
- Oracle10g 10.2 SQLリファレンス
- Oracle10g データウェアハウスガイド(※入手には会員登録が必要)