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
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;
- 1. è possibile animare gli inserti e le eliminazioni di Flexbox?
- 2. SQL Profiler non mostra inserimenti/eliminazioni/aggiornamenti
- 3. Come posso impedire l'aggiornamento delle viste materializzate durante pg_restore?
- 4. Unisci a più aggiornamenti e inserti
- 5. Indice cluster - multiparte vs indice di parte singola ed effetti di inserimenti/eliminazioni
- 6. Confronta due elenchi per aggiornamenti, eliminazioni e aggiunte
- 7. Come ottengo il numero di visualizzazioni in Windows?
- 8. Entity Framework 4 - Ottieni SQL generato per aggiornamenti/inserti
- 9. Come posso trovare il numero di anni tra due date?
- 10. Come posso trovare il numero di elementi in una matrice?
- 11. Come trovare il numero massimo
- 12. Visualizzazioni duplicate su Android durante il runtime
- 13. Come posso trovare il numero di 9s in un numero intero
- 14. Viste materializzate da PostgreSQL
- 15. Inserti SQL batch in .NET
- 16. Oracle - RIFRESTO VELOCE Viste materializzate con aggiornamenti LEFT JOINS molto lenti
- 17. C'è un modo per disabilitare gli aggiornamenti/eliminazioni, ma consentire comunque ai trigger di eseguirli?
- 18. Python: Come verificare gli aggiornamenti RSS con feedparser ed etags
- 19. Come trovare il numero ottimale di mapper durante l'importazione e l'esportazione di Sqoop?
- 20. Trovare il numero di inversioni di permutazione
- 21. come trovare il numero medio in python
- 22. Come trovare il numero di righe nel database di Heroku
- 23. Come eseguire il debug delle doppie eliminazioni in C++?
- 24. Contenitore con inserti e indici rapidi?
- 25. Come trovare il numero di connessioni simultanee di SQL Server
- 26. Accelerare un gran numero di aggiornamenti e inserimenti mysql
- 27. trovare il numero di possibili Alphabet stringhe da Numero Array
- 28. Come posso ridurre il numero di query?
- 29. Come posso contare il numero di bambini?
- 30. Come trovare il numero della porta installata di oracle 11g
Grazie per questa risposta molto approfondita! – user1284595