web-dev-qa-db-ja.com

OracleでNEXT句を使用して定期的なマテリアライズドビューの更新を設定し、更新を確認する

Oracleの具体化されたビューの更新の特定のタイミングの設定に関する適切なドキュメントが見つかりません。ドキュメントといくつかの例を読みましたが、NEXT句の使用に関する明確なドキュメントはありません。たとえば、毎日午前8時と午後8時に更新を設定するにはどうすればよいですか? 1日に3回更新するにはどうすればよいですか?

これが私の場合に使用しているものです。明日の午前7時に更新が開始され、次に12時間ごとに更新が開始されることを理解していますか?

alter materialized view MY_VIEW
refresh fast
start with (sysdate+1) + 7/24
next trunc(sysdate) + ((trunc(to_char(sysdate,'HH24')/12)*12)+12)/24

また、タイミングの設定後にマテリアライズドビューが更新されたかどうかを確認する方法があるかどうかも知りたいです。

更新:MVを毎時間更新しようとしましたが、うまくいきませんでした。なんでそれなのかしら。これが私が使ったものです:

CREATE MATERIALIZED VIEW  "MYVIEW"
  ORGANIZATION HEAP PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "APEX_xxxxxxxxxxxxxxxxxx" 
  BUILD IMMEDIATE
  USING INDEX 
  REFRESH FAST ON DEMAND START WITH sysdate+0 NEXT sysdate+1/24
  USING DEFAULT LOCAL ROLLBACK SEGMENT
  USING ENFORCED CONSTRAINTS DISABLE QUERY REWRITE
  AS select *
from <mydblinktable>
1
Sejal Parikh

代わりにDBMS_SCHEDULERを使用し、更新するたびにジョブを使用します。これにより、以前の実行を管理および表示することがより簡単になります。

CREATE OR REPLACE PROCEDURE REFRESH_MY_VIEW
AS
BEGIN
    DBMS_MVIEW.REFRESH('MY_VIEW');
END;
/

毎日午前8時に更新:

BEGIN
    DBMS_SCHEDULER.CREATE_JOB
    (
    job_name            => 'REFRESH_MY_VIEW',
    job_type            => 'PLSQL_BLOCK',
    job_action          => 'REFRESH_MY_VIEW',
    number_of_arguments => 0,
    start_date          => SYSTIMESTAMP, 
    repeat_interval => 'freq=daily; byhour=8; byminute=0; bysecond=0;',
    end_date            => NULL,
    enabled             => TRUE,
    auto_drop           => FALSE,
    comments            => 'Refreshes MY_VIEW at 8am'
    );
END;
/

毎日午後8時に更新:

BEGIN
    DBMS_SCHEDULER.CREATE_JOB
    (
    job_name            => 'REFRESH_MY_VIEW',
    job_type            => 'PLSQL_BLOCK',
    job_action          => 'REFRESH_MY_VIEW',
    number_of_arguments => 0,
    start_date          => SYSTIMESTAMP, 
    repeat_interval => 'freq=daily; byhour=20; byminute=0; bysecond=0;',
    end_date            => NULL,
    enabled             => TRUE,
    auto_drop           => FALSE,
    comments            => 'Refreshes MY_VIEW at 8pm'
    );
END;
/

*_SCHEDULER_JOB_LOGおよび*_SCHEDULER_JOB_RUN_DETAILSデータディクショナリビューは、実行された内容、タイミング、およびエラーが発生したかどうかを追跡するために必要なすべての情報を提供します。ドキュメントリンク ここ

コメントで指摘したように、次のように、複数のby hour句をカンマ区切りで追加できます。repeat_interval => 'freq=daily; byhour=8,20; byminute=0; bysecond=0;'

5
Philᵀᴹ