Giới hạn làm lại cho chế độ xem hoàn toàn được làm mới hoặc tương đương thủ công


10

Nhật ký chế độ xem được vật chất hóa (MV) có thể được sử dụng để cho phép MV thực hiện làm mới nhanh, điều này chỉ sửa đổi dữ liệu đã thay đổi. Tuy nhiên, các điều kiện khác nhau ngăn MV sử dụng nhật ký và do đó yêu cầu làm mới hoàn toàn. Oracle đã thực hiện làm mới hoàn toàn nguyên tử dưới dạng xóa và chèn mọi bản ghi. Nó thực hiện điều này ngay cả khi cuối cùng không có thay đổi nào đối với dữ liệu.

Có cách nào để làm cho bản sao này thông minh liên quan đến việc làm lại thế hệ không? Một MERGE theo sau là XÓA yêu cầu truy vấn nguồn hai lần. Nó có đáng để thu thập số lượng lớn dữ liệu để thực hiện BULK MERGE và XÓA? Có cách nào tốt hơn?

Cập nhật:

Tôi đã khám phá bằng cách sử dụng một bảng tạm thời toàn cầu như là một khu vực tổ chức. Mặc dù họ sử dụng ít hơn một nửa số làm lại, nhưng họ vẫn sử dụng nhiều.


Bạn có thể gửi mã gtt? gtt không tạo ra làm lại trực tiếp, nhưng họ tạo ra hoàn tác - và hoàn tác tạo lại. insertops tạo ra hoàn tác ít hơn nhiều so với deletehoặc updateops (hầu như không có trong thực tế). Có nhiều gtts để tránh bất kỳ ops đắt tiền nào có thể là một cách tiếp cận tốt
Jack nói hãy thử topanswers.xyz

@Jack Douglas psoug.org/reference/gtt.html có Bản trình diễn thế hệ làm lại GTT cho thấy giảm 60% làm lại giữa bảng vật lý và GTT cho inserts. Điều này phù hợp chặt chẽ với kết quả tôi đang thấy và tốt hơn nhưng không tốt như tôi muốn.
Leigh Riffel

Các thử nghiệm đó (theo từng hàng và không có appendgợi ý) không phải là điều kiện lý tưởng để giảm làm lại - Tôi đã chạy một số thử nghiệm để cho biết ý tôi là gì. Được đăng dưới dạng câu trả lời vì chúng sẽ không phù hợp với một bình luận
Jack nói hãy thử topanswers.xyz

Câu trả lời:


5

Điều này chỉ nhằm thể hiện việc sử dụng lại các inserthoạt động khác nhau chứ không phải trả lời toàn bộ câu hỏi. Kết quả trên ví dụ 10g của tôi không phải là 100% xác định, nhưng bức tranh rộng vẫn giữ nguyên mỗi lần tôi chạy qua.

Đối với các bảng heap, tôi không biết tại sao insert /*+ append */tạo lại nhiều hơn.

thử nghiệm:

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

kiểm tra:

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

kết quả:

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                   

Bạn đúng tất nhiên. Tôi nên đã bắt được điều đó trong các thử nghiệm của họ. Tôi sẽ thử.
Leigh Riffel

6

Câu hỏi hay. Tôi đã "giải quyết" vấn đề này cho tình huống của mình một thời gian trước bằng cách tạo ra các MV và bất kỳ chỉ mục nào về chúng NITALGING. Không có vấn đề gì với tình huống của tôi - dù sao tôi cũng đang làm mới toàn bộ khung nhìn, tại sao tôi lại cần làm lại?


1
Bạn có thể cần ATOMIC_REFRESH = false (trên 10g trở lên). Không chắc chắn những tác động đối với bất kỳ cơ sở dữ liệu dự phòng hoặc phục hồi với nhật ký lưu trữ?
Jack nói hãy thử topanswers.xyz

Tôi chạy một logic và một chế độ chờ vật lý trên cơ sở dữ liệu tôi đã làm điều này với. Không có vấn đề ở đó. Tôi đã gặp phải một vấn đề với việc tạo các bản sao DB - phải xem các ghi chú của tôi nhưng có một lỗi đôi khi tôi sẽ gặp phải khi thực hiện khôi phục trên một vùng bảng với các bảng ghi chú. Tôi đã đọc các đề xuất để tạo một không gian bảng dành riêng cho các bảng / chỉ mục không đăng ký để tránh các vấn đề như vậy. Tôi đã tìm ra cách để giải quyết nó mặc dù.
DCookie

@Jack, tôi tin rằng tôi đã phải sử dụng làm mới không nguyên tử.
DCookie

Hmmm, nếu tôi sử dụng chế độ xem cụ thể hóa tiêu chuẩn, nó cần thực hiện làm mới nguyên tử, vì vậy điều này sẽ không hiệu quả với tôi. Một số người khác có thể thấy nó hữu ích, vì vậy nó vẫn là một câu trả lời tốt.
Leigh Riffel

Tại sao nó cần một sự làm mới nguyên tử? Theo tôi hiểu, cài đặt thành sai chỉ ảnh hưởng đến việc làm mới ĐẦY ĐỦ. Xem bài đăng trên Asktom này: asktom.oracle.com/pls/apex/ Kẻ
DCookie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.