web-dev-qa-db-fra.com

Utilisation de la clause suivante pour définir une actualisation périodique de la visualisation matérialisée dans Oracle et vérifiant Actualiser

Je ne suis pas en mesure de trouver la bonne documentation sur la définition de timings spécifiques pour l'actualisation de la visualisation matérialisée pour Oracle. Je lisons la documentation et quelques exemples là-bas, mais il n'y a pas de documentation définitive sur l'utilisation de la clause suivante. Que ferais-je pour mettre en place une actualisation tous les jours à 8h et 20 heures par exemple? Comment devrais-je réaliser une rafraîchissement 3 fois par jour?

Voici ce que j'utilise dans mon cas. Je comprends que cela commencera à rafraîchir à 7h du matin demain et ensuite toutes les 12 heures?

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

Je veux aussi savoir s'il existe un moyen de savoir comment vérifier si la vue matérialisée a été rafraîchie une fois que les horaires sont définis.

MISE À JOUR: J'ai essayé de rafraîchir mon MV toutes les heures, ce qui ne fonctionnait pas. Je me demande pourquoi cela est-ce. Voici ce que j'ai utilisé:

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

J'utiliserais DBMS_SCHEDULER Au lieu de cela, avec un travail pour chaque rafraîchissement. Il est alors plus facile de gérer et d'afficher les exécutions précédentes.

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

Actualiser à 8h tous les jours:

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;
/

Actualiser à 20h00 tous les jours:

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;
/

Le *_SCHEDULER_JOB_LOG et *_SCHEDULER_JOB_RUN_DETAILS Data Dictionnaire Les vues fournissent toutes les informations dont vous avez besoin pour suivre ce qui est exécuté, quand et si des erreurs sont survenues. Lien de documentation ici .

Comme indiqué dans un commentaire, vous pouvez ajouter plusieurs by hour clauses, séparées par des virgules, comme suit: repeat_interval => 'freq=daily; byhour=8,20; byminute=0; bysecond=0;'

5
Philᵀᴹ