マテリアライズド・ビューのリフレッシュ
マテリアライズド・ビューは SELECT 文の実行結果を実体として保存し、利用するオブジェクトです。元のテーブルが更新されると正確性が失われるため、定期的にリフレッシュを行う機能を持っています。定期リフレッシュのマテリアライズド・ビューを作成すると、内部的には DBMS_SCHEDULER パッケージを使ったジョブが作成されます。本記事では DBMS_SCHEDULER パッケージのジョブ定義を確認します。環境は以下の通りです。
| 項目 | 実行環境 |
|---|---|
| オペレーティング・システム | Oracle Linux 9.6 |
| RDBMS | Oracle AI Database 26ai |
| PDB名 | ORCLPDB1 |
| TNS名 | ORCLPDB1 |
| ユーザ名 | SCOTT |
| データベース・リンク名 | LINK1 |
トランザクション単位でマテリアライズド・ビューを更新する方法もありますが、ここでは触れません。
マテリアライズド・ビューの作成
定期リフレッシュを行うマテリアライズド・ビューを作成します。以下の例では1時間毎にリモート・テーブルから完全リフレッシュを行うマテリアライズド・ビューを作成しています。
SQL> CREATE MATERIALIZED VIEW mview1
2 BUILD IMMEDIATE
3 REFRESH COMPLETE
4 ON DEMAND
5 START WITH SYSDATE
6 NEXT SYSDATE + 1/24
7 AS
8 SELECT * FROM data2@link1;
Materialized view created.
USER_SCHEDULER_JOBS ディクショナリを参照すると以下の値を得られました。下記の表に示されていない列には値が指定されていませんでした。
| 列名 | 定義 | 備考 |
|---|---|---|
| JOB_NAME | MV_RF$J_0_S_1442 | 自動生成された名前 |
| JOB_STYLE | REGULAR | |
| JOB_CREATOR | SCOTT | |
| JOB_TYPE | PLSQL_BLOCK | |
| JOB_ACTION | dbms_refresh.refresh('"SCOTT"."MVIEW1"'); | |
| NUMBER_OF_ARGUMENTS | 0 | |
| SCHEDULE_TYPE | PLSQL | |
| START_DATE | 28-OCT-26 09.57.00.000000 AM +09:00 | SYSDATE 指定値 |
| REPEAT_INTERVAL | SYSDATE + 1/24 | CREATE 文 NEXT 指定値 |
| JOB_CLASS | DEFAULT_JOB_CLASS | |
| ENABLED | TRUE | |
| AUTO_DROP | TRUE | |
| RESTART_ON_RECOVERY | FALSE | |
| RESTART_ON_FAILURE | FALSE | |
| STATE | SCHEDULED | |
| JOB_PRIORITY | 3 | |
| RUN_COUNT | 1 | |
| FAILURE_COUNT | 0 | |
| RETRY_COUNT | 0 | |
| LAST_START_DATE | 28-OCT-26 09.57.00.848126 AM +09:00 | |
| LAST_RUN_DURATION | +000000000 00:00:00.362138 | |
| NEXT_RUN_DATE | 28-OCT-26 10.57.00.000000 AM +09:00 | |
| LOGGING_LEVEL | OFF | |
| STORE_OUTPUT | TRUE | |
| STOP_ON_WINDOW_CLOSE | FALSE | |
| INSTANCE_STICKINESS | TRUE | |
| SYSTEM | FALSE | |
| JOB_WEIGHT | 1 | |
| NLS_ENV | NLS_LANGUAGE='AMERICAN' NLS_TERRITORY='AMERICA' NLS_CURRENCY='\$' NLS_ISO_CURRENCY='AMERICA' NLS_NUMERIC_CHARACTERS='.,' NLS_CALENDAR='GREGORIAN' NLS_DATE_FORMAT='DD-MON-RR' NLS_DATE_LANGUAGE='AMERICAN' NLS_SORT='BINARY' NLS_TIME_FORMAT='HH.MI.SSXFF AM' NLS_TIMESTAMP_FORMAT='DD-MON-RR HH.MI.SSXFF AM' NLS_TIME_TZ_FORMAT='HH.MI.SSXFF AM TZR' NLS_TIMESTAMP_TZ_FORMAT='DD-MON-RR HH.MI.SSXFF AM TZR' NLS_DUAL_CURRENCY='$' NLS_COMP='BINARY' NLS_LENGTH_SEMANTICS='BYTE' NLS_NCHAR_CONV_EXCP='FALSE' | |
| NUMBER_OF_DESTINATIONS | 1 | |
| DEFERRED_DROP | FALSE | |
| ALLOW_RUNS_IN_RESTRICTED_MODE | FALSE | |
| COMMENTS | dbms_refresh: submit_sch_job | |
| FLAGS | 9.0072E+15 | |
| RESTARTABLE | FALSE | |
| HAS_CONSTRAINTS | FALSE | |
| FAIL_ON_SCRIPT_ERROR | FALSE |
上記でわかる通り、JOB_ACTION 列には DBMS_MVIEW.REFRESH プロシージャが指定されています。このプロシージャの実行によりマテリアライズド・ビューがリフレッシュされることがわかります。
またジョブの優先順位(job_priority)は 3 であり、デフォルト値の優先順位で実行されます。
リフレッシュ・タイプの指定
リフレッシュ方法の異なるマテリアライズド・ビューを作成し、ジョブの定義を確認します。マテリアライズド・ビュー MVIEW2 はリフレッシュ方法 FORCE、マテリアライズド・ビュー MVIEW3 はリフレッシュ方法 FAST を指定しました。
SQL> CREATE MATERIALIZED VIEW mview2
2 BUILD IMMEDIATE
3 REFRESH FORCE
4 ON DEMAND
5 START WITH SYSDATE
6 NEXT SYSDATE + 1/24
7 AS
8 SELECT * FROM data2@link1;
Materialized view created.
SQL> CREATE MATERIALIZED VIEW mview3
2 BUILD IMMEDIATE
3 REFRESH FAST
4 ON DEMAND
5 START WITH SYSDATE
6 NEXT SYSDATE + 1/24
7 AS
8 SELECT * FROM data2@link1;
Materialized view created.
マテリアライズド・ビューの定義を確認します。指定通りになっています。
SQL> SELECT MVIEW_NAME,REFRESH_MODE,REFRESH_METHOD FROM user_mviews;
MVIEW_NAME REFRESH_M REFRESH_
-------------------- --------- --------
MVIEW1 DEMAND COMPLETE
MVIEW2 DEMAND FORCE
MVIEW3 DEMAND FAST
ジョブの定義を確認します。
SQL> SELECT job_name, job_action FROM user_scheduler_jobs ORDER BY job_name;
JOB_NAME JOB_ACTION
-------------------- --------------------------------------------------
MV_RF$J_0_S_1442 dbms_refresh.refresh('"SCOTT"."MVIEW1"');
MV_RF$J_0_S_1444 dbms_refresh.refresh('"SCOTT"."MVIEW2"');
MV_RF$J_0_S_1446 dbms_refresh.refresh('"SCOTT"."MVIEW3"');
DBMS_REFRESH.REFRESH プロシージャにはリフレッシュ方法を指定するオプション(method オプション)がありますが、ジョブ定義では指定されていないことがわかります。このためマテリアライズド・ビューの自動リフレッシュではマテリアライズド・ビュー側の定義に従ってリフレッシュが行われることがわかります。
Author: Noriyoshi Shinoda / Date: October 28, 2026