2012-03-21 12 views
6

Ho un data mart masterizzato dal nostro database Oracle OLTP utilizzando le Viste materializzate di base con capacità di aggiornamento rapido su richiesta. L'aggiornamento funziona correttamente. Quello che mi interessa aggiungere sono alcune statistiche sull'aggiornamento di ciascuna Vista materializzata, come il numero di inserti, aggiornamenti ed eliminazioni applicate alla tabella principale dall'ultimo aggiornamento come i dati che posso trovare in user_tab_modifications. Questo è possibile per le viste materializzate?Visualizzazioni materializzate: come posso trovare il numero di aggiornamenti, inserti ed eliminazioni applicate durante l'aggiornamento?

risposta

6

Prima di eseguire l'aggiornamento, è possibile eseguire una query nel log di visualizzazione materializzato per vedere quale tipo di vettore di modifica memorizza. Questi saranno i vettori di cambiamento che devono essere applicati alla vista materializzata durante il processo di aggiornamento (supponendo che ci sia solo una vista materializzata che dipende da questo log di visualizzazione materializzato).

Ad esempio, se creo il mio tavolo, il mio registro di vista materializzato e la mia vista materializzata.

SQL> create table foo(col1 number primary key); 

Table created. 

SQL> create materialized view log on foo; 

Materialized view log created. 


SQL> ed 
Wrote file afiedt.buf 

    1 create materialized view mv_foo 
    2 refresh fast on demand 
    3 as 
    4 select * 
    5* from foo 
SQL>/

Materialized view created. 

SQL> insert into foo values(1); 

1 row created. 

SQL> insert into foo values(2); 

1 row created. 

SQL> commit; 

Commit complete. 

Ora, io aggiornare la vista materializzata e verificare che il tavolo e la vista materializzata sono sincronizzati

SQL> exec dbms_mview.refresh('MV_FOO'); 

PL/SQL procedure successfully completed. 

SQL> select * from user_tab_modifications where table_name = 'MV_FOO'; 

no rows selected 

SQL> select * from foo; 

     COL1 
---------- 
     1 
     2 

SQL> select * from mv_foo; 

     COL1 
---------- 
     1 
     2 

Dal momento che i due oggetti sono in sincronia, il registro vista materializzata è vuota (la materializzata log vista sarà nominato MLOG$_<<table name>>

SQL> select * from mlog$_foo; 

no rows selected 

Ora, se si inserisce una nuova riga nella tabella, vedrò una riga nel registro vista materializzata con un DMLTYPE$$ di I indicare un INSERT

SQL> insert into foo values(3); 

1 row created. 

SQL> select * from mlog$_foo; 

     COL1 SNAPTIME$ D O 
---------- --------- - - 
CHANGE_VECTOR$$ 
-------------------------------------------------------------------------------- 
    XID$$ 
---------- 
     3 01-JAN-00 I N 
FE 
2.2519E+15 

Così si potrebbe fare qualcosa di simile per ottenere il numero di attesa inserimenti, aggiornamenti ed eliminazioni.

SELECT SUM(CASE WHEN dmltype$$ = 'I' THEN 1 ELSE 0 END) num_pending_inserts, 
     SUM(CASE WHEN dmltype$$ = 'U' THEN 1 ELSE 0 END) num_pending_updates, 
     SUM(CASE WHEN dmltype$$ = 'D' THEN 1 ELSE 0 END) num_pending_deletes 
    FROM mlog$_foo 

Dopo aver aggiornato il registro di visualizzazione materializzato, tuttavia, questa informazione è sparita.

D'altra parte, USER_TAB_MODIFICATIONS dovrebbe tracciare il numero approssimativo di modifiche apportate alla vista materializzata dall'ultima volta che le statistiche sono state raccolte su di esso proprio come avrebbe tracciato le informazioni per una tabella. È quasi certamente necessario chiamare DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO per forzare la visualizzazione dei dati se si desidera acquisire i dati prima e dopo l'aggiornamento della vista materializzata.

SELECT inserts, updates, deletes 
    INTO l_starting_inserts, 
     l_starting_updates, 
     l_starting_deletes 
    FROM user_tab_modifications 
WHERE table_name = 'MV_FOO'; 

dbms_mview.refresh('MV_FOO'); 
dbms_stats.flush_database_monitoring_info; 

SELECT inserts, updates, deletes 
    INTO l_ending_inserts, 
     l_ending_updates, 
     l_ending_deletes 
    FROM user_tab_modifications 
WHERE table_name = 'MV_FOO'; 

l_incremental_inserts := l_ending_inserts - l_starting_inserts; 
l_incremental_updates := l_ending_updates - l_starting_updates; 
l_incremental_deletes := l_ending_deletes - l_starting_deletes; 
+0

Grazie per questa risposta molto approfondita! – user1284595

Problemi correlati