web-dev-qa-db-ja.com

マテリアライズドビューの更新がいつ完了したかを知る方法

特定のイベント(たとえば、誰かがGUIを介してデータベースに新しいデータを追加する)の後、一部のデータを集約するマテリアライズドビューを更新する必要があります。更新が完了した後でのみ、MWからクエリを実行してGUIにGUIを表示する必要があります。更新された結果。

さて、私の問題は、更新がいつ完了したかを知る方法が必要であることです。これにより、クエリを実行して、最新の結果を確実に取得できます。

MVは次のように指定されます。

CREATE MATERIALIZED VIEW ASSAY
("TYPE","METHOD",COMPOUND_CORPORATE_ID,RESULTS_AVG,RESULTS_ST_DEV,RESULTS_N)
AS
select "TYPE","METHOD",AVG("RESULTS"), STDDEV("RESULTS") , COUNT("RESULTS")
from ASSAY_INHIB
where upper("VALIDATION")='YES'
group by "TYPE","METHOD",COMPOUND_CORPORATE_ID;
CREATE INDEX assays_inhib_parent ON ASSAY(compound_corporate_id);
ALTER MATERIALIZED VIEW ASSAY  REFRESH FORCE   ON DEMAND;

GUIからコマンドexec REFRESH_MV()を使用してストアドプロシージャを呼び出します。このストアドプロシージャは次のようになります。

CREATE  PROCEDURE REFRESH_MV () AS
BEGIN
    DBMS_MVIEW.REFRESH('ASSAY');
END REFRESH_MV;

問題は、いつMVにクエリを実行できるかわからず、データが最新であることを確認することです。誰か助けてもらえますか?

ありがとう

1
Rossella

あなたは言った-

特定のイベント(たとえば、誰かがGUIを介してデータベースに新しいデータを追加する)の後、一部のデータを集約するマテリアライズドビューを更新する必要があります。更新が完了した後でのみ、MWからクエリを実行してGUIにGUIを表示する必要があります。更新された結果...

ON COMMITの代わりにON DEMANDリフレッシュを使用できますが、先ほど言ったように、要件と実装については不明です。

コミット時のリフレッシュ

マテリアライズドビューは、ON COMMITメソッドを使用して自動的に更新できます。したがって、マテリアライズドビューが定義されているテーブルを更新したトランザクションがコミットされると、それらの変更は自動的にマテリアライズドビューに反映されます。このアプローチを使用する利点は、マテリアライズドビューを更新することを覚えておく必要がないことです。

次のクエリは、MVが最後に更新された時期を知るために使用できます。

SQL> alter session set nls_date_format='dd/mm/yy hh24:mi:ss';
SQL> select owner, mview_name, last_refresh_type, last_refresh_date
    from all_mviews;

出力例:

USERNAME         M_VIEW_TEST        COMPLETE   02/02/17 01:01:19

v$mvrefresh動的パフォーマンスビューを使用して、どのMVが更新されているかを知ることもできます。

select currmvowner, currmvname from v$mvrefresh;

参考文献:

  • ALL_MVIEWS
  • 3
    JSapkota

    組み込みのビューをクエリできると思いますDBA_JOBSおよびDBA_JOBS_RUNNING次のクエリを使用:

    SELECT  
         A.JOB JOB#, 
         SCHEMA_USER MVIEW_OWNER, 
         substr(DECODE(SUBSTR(WHAT,INSTR(WHAT,'.',1,2)+2,INSTR(WHAT,'”',1,4)-4-INSTR(WHAT,'.',1,2)+2),NULL,SUBSTR(WHAT,1,80), 
         SUBSTR(WHAT,INSTR(WHAT,'.',1,2)+2,INSTR(WHAT,'”',1,4)-4-INSTR(WHAT,'.',1,2)+2)),0,80) JOB_DESCRIPTION, 
         to_char(LAST_DATE, 'yyyy-mm-dd hh24:mi:ss') LAST_RUN_DATE, 
         to_char(NEXT_DATE, 'yyyy-mm-dd hh24:mi:ss') NEXT_SCHED_RUN_DATE, 
         DECODE(BROKEN,'Y','YES','N','NO',' ') IS_BROKEN, 
         FAILURES,  
         RUNNING IS_RUNNING, 
         B.SID SID 
         FROM DBA_JOBS A LEFT OUTER JOIN (SELECT JOB,'YES' RUNNING,SID FROM DBA_JOBS_RUNNING ) B 
             ON A.JOB = B.JOB 
        ORDER BY SCHEMA_USER, JOB_DESCRIPTION;
    
    0