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
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;
Bu derinlemesine yanıt için teşekkür ederiz! – user1284595