2012-03-21 10 views
6

OLTP Oracle veritabanımızdan, isteğe bağlı hızlı yenileme özelliği ile temel Materyalleştirilmiş Görünümleri kullanarak uzman bir veri marketim var. Yenile çalışıyor. Eklemek istediklerim, Materyalize Edilmiş Görünüm'ün yenilenmesiyle ilgili bazı istatistiklerdir. Örneğin, user_tab_modifications'da bulabildiğim veriler gibi son yenilemeden beri ana tabloya uygulanan ekleme, güncelleme ve silme sayısı gibi. Materyalize Görüşler için bu mümkün mü?Materyalleştirilmiş Görüntüleme: Yenileme sırasında uygulanan güncelleme, ekleme ve silme sayısını nasıl bulabilirim?

cevap

6

Yenilemeden önce, ne tür bir değişim vektörlerinin saklandığını görmek için materyalize edilmiş görünüm günlüğünü sorgulayabilirsiniz. Yenilenme süreci sırasında gerçekleşen görüşe uygulanması gereken değişim vektörleri bunlar olacaktır (bu gerçekleşmiş görüş loguna bağlı olan sadece bir maddileşmiş görüş olduğu varsayılarak).

Örneğin, masamı oluşturursam, materyalleştirilmiş görünüm günlüğüm ve materyalleştirilmiş görünümüm.

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. 

Şimdi, hayata görünümü yenilemek ve (iki nesne senkronize olduğu

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 

, hayata görünüşüdür günlük boş masa ve hayata görünüşüdür senkronize olduğu materialized doğrulamak görünüm günlüğü Ben tabloya yeni bir satır eklerseniz, birile hayata bakış günlüğüne bir satır görürsünüz, Şimdi

SQL> select * from mlog$_foo; 

no rows selected 

MLOG$_<<table name>> adlandırılacaktır Yani bekleyen Ekleme, güncelleme sayısını almak için böyle bir şey yapabileceğini bir 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 

belirten I ait 43.210 ve siler. Ancak, birleştirilmiş görünüm günlüğünü yeniledikten sonra, bu bilgi kaybolur.

Diğer taraftan, USER_TAB_MODIFICATIONS, bir tabloya ilişkin bilgileri izleyeceği şekilde, istatistiklerin toplandığı son zamandan bu yana gerçekleşen görünümde yapılan yaklaşık değişiklik sayısını izlemelidir. Verileri, görüntülenen görünümün yenilemesinden önce ve sonra yakalamak istediğinizde verilerin görünür olmasını sağlamak için neredeyse kesinlikle 'u aramanız gerekecektir.

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

Bu derinlemesine yanıt için teşekkür ederiz! – user1284595