Oracleのマテリアライズド・ビューのリフレッシュ(手動での完全リフレッシュ)
前回のエントリ(d:id:mrgoofy33:20100608)でマテリアライズド・ビューを作りましたが、リフレッシュ方法などが良くわかっていなかったので、調べてみました。
今回は、自動でのリフレッシュは必要なかったので、手動での完全リフレッシュを試してみました。
リフレッシュの方法
refresh complete | 完全リフレッシュ |
---|---|
refresh fast | 高速リフレッシュ |
refresh force | 高速リフレッシュ or 完全リフレッシュ(デフォルト) |
never refresh | リフレッシュをしない |
リフレッシュのタイミング
on commit | コミットされたときにリフレッシュ |
---|---|
start with・next | 指定時刻でリフレッシュ |
on demand | 手動でのリフレッシュ |
記述例
手動での完全リフレッシュを行う場合
create materialized view TEST_VIEW refresh complete on demand ・・・
※今回はこれを使用しました。
手動での完全リフレッシュor高速リフレッシュを行う場合
リフレッシュの方法、リフレッシュのタイミングを指定しないときはコレと同じになる。
create materialized view TEST_VIEW refresh force on demand ・・・
高速リフレッシュを行うには色々と条件があるので、条件が合致すれば高速リフレッシュ。
条件が合わずに高速リフレッシュが出来ない場合は、完全リフレッシュになる。
コミットしたときに高速リフレッシュを行う場合
create materialized view TEST_VIEW refresh fast on commit ・・・
実際に高速リフレッシュを指定する場合には、「マテリアライズド・ビュー・ログ」を作ったり、色々な制限があるようです。
今回は高速リフレッシュを使わなかったので、詳しいことは書けません。
詳しい情報は以下のページがとても参考になると思います。
http://www.ne.jp/asahi/hishidama/home/tech/oracle/mview.html#refresh_fast
手動でのリフレッシュ方法
マテビューで指定された方法(完全 or 高速)でリフレッシュ
SQL> exec dbms_mview.refresh('TEST_VIEW'); PL/SQL procedure successfully completed.
明示的に完全リフレッシュ
マテビューで高速リフレッシュを指定している場合でも、'c'を指定することで完全リフレッシュが出来る。
SQL> exec dbms_mview.refresh('TEST_VIEW','c'); PL/SQL procedure successfully completed.
明示的に高速リフレッシュ
マテビューで高速リフレッシュを指定している場合でも、'c'を指定することで完全リフレッシュが出来る。
マテビューで高速リフレッシュを指定している場合(成功する)
SQL> exec dbms_mview.refresh('TEST_VIEW','f'); PL/SQL procedure successfully completed.
マテビューで高速リフレッシュを指定出来ていない場合(失敗する)
SQL> exec dbms_mview.refresh('TEST_VIEW','f'); BEGIN dbms_mview.refresh('TEST_VIEW','f'); END; * ERROR at line 1: ORA-23413: table "SYSTEM"."TEST_TABLE" does not have a materialized view log ORA-06512: at "SYS.DBMS_SNAPSHOT", line 1883 ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2089 ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2058 ORA-06512: at line 1
参考にしたページ
マテリアライズド・ビュー(マテリアライズド・ビューの詳しい説明)
http://www.ne.jp/asahi/hishidama/home/tech/oracle/mview.html
@IT - Oracleの機能を使って表の結合を高速化する
http://www.atmarkit.co.jp/fdb/rensai/orasql11/orasql11_1.html