Batasi pengulangan untuk tampilan terwujud penyegaran lengkap atau setara manual

10

Log materialized view (MV) dapat digunakan untuk memungkinkan MV melakukan refresh cepat yang hanya mengubah data yang telah berubah. Namun, berbagai kondisi mencegah MV dari menggunakan log dan karenanya memerlukan penyegaran lengkap. Oracle menerapkan penyegaran lengkap atom sebagai penghapusan dan penyisipan setiap catatan. Ia melakukan ini bahkan jika pada akhirnya tidak ada perubahan pada data.

Apakah ada cara untuk membuat replikasi ini menjadi cerdas sehubungan dengan generasi redo ? MERGE yang diikuti oleh DELETE membutuhkan permintaan sumber dua kali. Apakah layak untuk mengumpulkan data secara massal untuk melakukan BULK MERGE dan DELETE? Apakah ada cara yang lebih baik?

Memperbarui:

Saya menjelajahi menggunakan tabel sementara global sebagai area pementasan. Meskipun mereka menggunakan kurang dari setengah redo, mereka masih menggunakan terlalu banyak.

Leigh Riffel
sumber
Bisakah Anda memposting kode gtt? gtt tidak menghasilkan redo secara langsung, tetapi mereka menghasilkan undo - dan undo menghasilkan redo. insertops menghasilkan jauh lebih sedikit undo daripada deleteatau updateops (hampir tidak ada sebenarnya). Memiliki banyak gtts untuk menghindari operasi mahal mungkin merupakan pendekatan yang baik
Jack mengatakan coba topanswers.xyz
@Jack Douglas psoug.org/reference/gtt.html memiliki Demo Generasi Merah GTT yang menunjukkan pengurangan 60% redo antara tabel fisik dan GTT untuk inserts. Ini sangat cocok dengan hasil yang saya lihat dan lebih baik tetapi tidak sebagus yang saya inginkan.
Leigh Riffel
Tes-tes itu (baris demi baris dan tidak ada appendpetunjuk) bukanlah kondisi yang ideal untuk mengurangi pengulangan - Saya telah menjalankan beberapa tes untuk menunjukkan apa yang saya maksud. Diposting sebagai jawaban karena mereka tidak akan cocok dalam komentar
Jack mengatakan coba topanswers.xyz

Jawaban:

5

Ini hanya dimaksudkan untuk menunjukkan penggunaan ulang berbagai insertoperasi daripada menjawab seluruh pertanyaan. Hasil pada instance 10g saya tidak 100% deterministik, tetapi gambaran luasnya tetap sama setiap kali saya berlari.

Untuk tabel heap, saya tidak tahu mengapa insert /*+ append */dihasilkan lebih banyak redo.

testbed:

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);

uji:

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';

hasil:

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                   
Jack mengatakan coba topanswers.xyz
sumber
Anda tentu saja benar. Saya seharusnya menangkap itu dalam tes mereka. Saya akan mencobanya.
Leigh Riffel
6

Pertanyaan bagus. Saya "memecahkan" masalah ini untuk situasi saya beberapa waktu lalu dengan membuat MV dan indeks pada mereka NOLOGGING. Tidak ada gunanya situasiku - lagipula aku melakukan penyegaran penuh dari pandangan, mengapa aku perlu mengulang?

DCookie
sumber
1
Anda mungkin perlu ATOMIC_REFRESH = false juga (pada 10g ke atas). Tidak yakin apa implikasinya untuk database siaga atau pemulihan dengan log arsip?
Jack bilang coba topanswers.xyz
Saya menjalankan siaga logis dan fisik pada database saya melakukan ini dengan. Tidak ada masalah di sana. Saya memang mengalami masalah dengan membuat salinan DB - harus melihat catatan saya tapi ada kesalahan yang kadang-kadang saya dapatkan tentang melakukan pemulihan pada tablespace dengan tabel nologging. Saya telah membaca rekomendasi untuk membuat tablespace yang dicadangkan untuk tabel / indeks yang nonlogging untuk menghindari masalah seperti itu. Saya sudah mencari tahu bagaimana menyelesaikannya.
DCookie
@ Jack, saya percaya saya harus menggunakan penyegaran bukan atom.
DCookie
Hmmm, jika saya menggunakan tampilan terwujud standar, perlu melakukan refresh atom, jadi ini tidak akan berhasil untuk saya. Orang lain mungkin menganggapnya berguna, jadi itu masih jawaban yang bagus.
Leigh Riffel
Mengapa perlu penyegaran atom? Seperti yang saya pahami, pengaturan ke false hanya memengaruhi penyegaran LENGKAP. Lihat posting asktom ini: asktom.oracle.com/pls/apex/…
DCookie