Malzeme görünümü tam yenileme veya manuel eşdeğeri için yineleme sınırlaması


10

Bir MV'nin yalnızca değişen verileri değiştiren hızlı bir yenileme yapmasına izin vermek için materyalize görünüm (MV) günlüğü kullanılabilir. Ancak, çeşitli koşullar MV'nin günlüğü kullanmasını önler ve bu nedenle tam bir yenileme gerektirir. Oracle, her kaydın silinmesi ve eklenmesi için atomik bir tam yenileme uyguladı. Sonuçta verilerde değişiklik olmasa bile bunu yapar.

Bu çoğaltmayı yeniden oluşturma konusunda akıllı yapmanın bir yolu var mı ? MERGE ve ardından DELETE, kaynağın iki kez sorgulanmasını gerektirir. BULK MERGE ve DELETE yapmak için verileri toplu olarak toplamaya değer mi? Daha iyi bir yol var mı?

Güncelleme:

Evreleme alanı olarak genel bir geçici tablo kullanarak araştırdım. Yinelemenin yarısından azını kullanıyor olsalar da, yine de çok fazla kullanıyorlar.


Gtt kodunu gönderebilir misiniz? gtt'ler doğrudan yinelemeyi üretmez, ancak geri almayı ve geri almayı yinelemeyi üretir. insertops çok az geri al üretmek deleteveya updateoperatör (aslında neredeyse hiçbiri). Herhangi bir pahalı ops önlemek için birden fazla gtt olması iyi bir yaklaşım olabilir
Jack diyor topanswers.xyz

@Jack Douglas psoug.org/reference/gtt.html , fiziksel bir tablo ile inserts için bir GTT arasında yinelemede% 60 azalma gösteren bir GTT Yeniden Yapma Demosu'na sahiptir . Bu, gördüğüm sonuçlarla yakından eşleşiyor ve daha iyi ama istediğim kadar iyi değil.
Leigh Riffel

Bu testler (satır satır ve appendipucu yok ) yinelemeyi azaltmak için ideal koşullar değildir - ne demek istediğimi göstermek için bazı testler yaptım. Bir yorum olarak sığmayacaklarından bir cevap olarak gönderildi
Jack denemek topanswers.xyz diyor

Yanıtlar:


5

Bu sadece inserttüm soruyu cevaplamak yerine çeşitli operasyonların yeniden kullanımını göstermeyi amaçlamaktadır . 10g örneğimin sonuçları% 100 deterministik değil, ancak geniş resim her karşılaştığımda aynı kaldı.

Yığın tabloları için, neden insert /*+ append */daha fazla yineleme oluşturulan bilmiyorum .

test ortamı:

create table heap_noappend(id integer, dummy char(500));
create table heap_append(id integer, dummy char(500));
create global temporary table gtt_noappend(id integer, dummy char(500));
create global temporary table gtt_append(id integer, dummy char(500));
create global temporary table gtt_results(stage integer, val integer);

Ölçek:

insert into gtt_results(stage, val)
select 0, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';

insert into heap_noappend(id, dummy)
select level, 'A' from dual connect by level<1000;

insert into gtt_results(stage, val)
select 1, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';

insert /*+ append */ into heap_append(id, dummy)
select level, 'A' from dual connect by level<1000;

insert into gtt_results(stage, val)
select 2, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';

insert into gtt_noappend(id, dummy)
select level, 'A' from dual connect by level<1000;

insert into gtt_results(stage, val)
select 3, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';

insert /*+ append */ into gtt_append(id, dummy)
select level, 'A' from dual connect by level<1000;

insert into gtt_results(stage, val)
select 4, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';

sonuç:

select * 
from( select decode(stage,1,'heap noappend',
                          2,'heap append',
                          3,'gtt noappend',
                          4,'gtt append') as operation, 
             val-lag(val) over(order by stage) as redo 
      from gtt_results)
where redo is not null;

OPERATION     REDO                   
------------- ---------------------- 
heap noappend 606932                 
heap append   690768                 
gtt noappend  41488                  
gtt append    256                   

Tabii ki haklısın. Bunu testlerinde yakalamalıydım. Bir deneyeceğim.
Leigh Riffel

6

İyi soru. Ben MV'ler ve onlara herhangi bir indeks NOLOGGING yaparak bir süre önce durumum için bu sorunu "çözdü". Bunun bir anlamı yoktu benim durumum - Zaten manzarayı tamamen yeniliyordum, neden tekrar yapmam gerekiyor?


1
ATOMIC_REFRESH = false değerine de ihtiyacınız olabilir (10g ve üzeri). Bekleme veritabanı veya arşiv günlükleriyle kurtarma için ne anlama geldiğinden emin değil misiniz?
Jack diyor ki topanswers.xyz

Ben bunu yaptım veritabanında mantıksal ve fiziksel bir bekleme çalıştırın. Orada sorun yok. DB kopyaları yapma ile ilgili bir sorunla karşılaştım - notlarıma bakmak zorundayım ama bazen nologging tabloları olan bir tablo üzerinde kurtarma gerçekleştirmeyle ilgili bir hata oluştu. Bu tür sorunları önlemek için günlükleri olmayan tablolar / dizinler için ayrılmış bir tablo alanı oluşturmak için öneriler okudum. Yine de nasıl çözüleceğini anladım.
DCookie

@Jack, atomik olmayan yenileme kullanmam gerektiğine inanıyorum.
DCookie

Hmmm, standart bir materyalize görünüm kullanırsam, atomik bir yenileme yapması gerekir, bu yüzden bu benim için işe yaramaz. Birisi faydalı bulabilir, bu yüzden hala iyi bir cevaptır.
Leigh Riffel

Neden atomik bir yenilemeye ihtiyacı var? Anladığım kadarıyla, false olarak ayarlamak yalnızca TAM yenilemeyi etkiler. Bu asktom yazısına bakın: asktom.oracle.com/pls/apex/…
DCookie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.