web-dev-qa-db-fra.com

Comment savoir quand une actualisation d'une vue matérialisée est terminée

Après un événement spécifique (par exemple, une personne ajoutez de nouvelles données dans la base de données via une interface graphique), j'ai besoin de rafraîchir une vue matérialisée qui prévoit certaines données et seulement après cette actualisation est complète, je dois interroger à la MW et à montrer à l'interface graphique. Résultats mis à jour.

Maintenant, mon problème est que j'ai besoin d'une façon de savoir quand l'actualisation est complète pour que je puisse ensuite interroger et vous assurer d'obtenir un résultat à jour.

Le MV est spécifié de cette manière:

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;

J'appelle à partir de l'interface graphique une procédure stockée avec la commande Exece Refresh_mv () et la procédure stockée est comme ceci:

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

Le problème est que je ne sais pas quand je peux interroger le MV et être sûr que les données sont à jour. Quelqu'un peut-il aider?

Merci

1
Rossella

Vous vous avez dit-

Après un événement spécifique (par exemple, une personne ajoutez de nouvelles données dans la base de données via une interface graphique), j'ai besoin de rafraîchir une vue matérialisée qui prévoit certaines données et seulement après cette actualisation est complète, je dois interroger à la MW et à montrer à l'interface graphique. Résultats mis à jour ...

Vous pouvez utiliser ON COMMIT Actualiser au lieu de ON DEMAND Mais je viens de dire que cela peut être, pas sûr de votre besoin et de votre mise en œuvre.

Engagez-vous rafraîchir

Une vue matérialisée peut être rafraîchie automatiquement à l'aide de la méthode de validation. Par conséquent, chaque fois qu'une transaction commise qui a mis à jour les tableaux sur lesquels une vue matérialisée est définie, ces modifications sont automatiquement reflétées dans la vue matérialisée. L'avantage d'utiliser cette approche est que vous ne devez jamais vous rappeler de rafraîchir la vue matérialisée.

La requête suivante peut être utilisée pour savoir quand le MV a été rafraîchi.

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;

Sortie d'échantillon:

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

Vous pouvez aussi utiliser v$mvrefresh Vue de performance dynamique pour savoir quel MV est en train d'actualiser.

select currmvowner, currmvname from v$mvrefresh;

Références:

  • all_mviews
  • 3
    JSapkota

    Je suppose que vous pouvez interroger les vues intégrées DBA_JOBS et DBA_JOBS_RUNNING avec la requête suivante:

    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
    John aka hot2use