구체화 된 뷰 완전 새로 고침 또는 수동으로 동등한 항목에 대한 재실행 제한


10

구체화 된 뷰 (MV) 로그를 사용하여 MV가 변경된 데이터 만 수정하는 빠른 새로 고침을 수행 할 수 있습니다. 그러나 다양한 조건으로 인해 MV가 로그를 사용하지 못하므로 완전히 새로 고쳐야합니다. 오라클은 모든 레코드의 삭제 및 삽입으로 원 자성 완전 새로 고침을 구현했습니다. 궁극적으로 데이터에 변화가없는 경우에도이를 수행합니다.

리두 생성과 관련 하여이 복제를 지능적 으로 만드는 방법이 있습니까? MERGE 뒤에 DELETE가 있으면 소스를 두 번 쿼리해야합니다. 대량 합병 및 삭제를 수행하기 위해 데이터를 대량 수집하는 것이 가치가 있습니까? 더 좋은 방법이 있습니까?

최신 정보:

전역 임시 테이블을 준비 영역으로 사용하여 탐색했습니다. 리두의 절반 이하를 사용하지만 여전히 많이 사용합니다.


gtt 코드를 게시 할 수 있습니까? gtt는 리두를 직접 생성하지 않지만 실행 취소를 생성합니다. insert작전은 훨씬 미만으로 취소 생성 delete또는 updateOPS (사실 거의 없음)을. 고가의 작전을 피하기 위해 여러 gtts를 갖는 것은 좋은 방법이 될 수 있습니다
잭 topanswers.xyz 시도라고

@Jack Douglas psoug.org/reference/gtt.html 에는 물리적 테이블과 inserts에 대한 GTT 간의 리두가 60 % 감소한 GTT 리두 생성 데모가 있습니다. 이것은 내가보고있는 결과와 밀접하게 일치하며 더 좋지만 원하는만큼 좋지 않습니다.
레이 리펠

이러한 테스트 (행별 및 append힌트 없음 )는 리두를 줄이기위한 이상적인 조건이 아닙니다. 내가 의미하는 바를 보여주기 위해 몇 가지 테스트를 수행했습니다. 그들은 코멘트에 맞지 않기 때문에 답변으로 게시 됨
잭은 말한다 topanswers.xyz 시도

답변:


5

이것은 insert전체 질문에 대답하기보다는 다양한 작업 의 재실행 사용법을 보여주기위한 것 입니다. 내 10g 인스턴스의 결과는 100 % 결정적이지는 않지만 가로 질러 볼 때마다 넓은 그림이 동일하게 유지됩니다.

힙 테이블의 경우 insert /*+ append */더 많은 리두 가 생성 된 이유를 모르겠습니다 .

테스트 베드 :

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

테스트:

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

결과:

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                   

물론 맞습니다. 나는 그들의 테스트에서 그것을 잡았어야했다. 시도해 볼게요.
레이 리펠

6

좋은 질문. 나는 MV와 그에 대한 색인을 NOLOGGING으로 만들어 내 상황에 대해이 문제를 잠시 동안 "해결했습니다". 내 상황에 아무런 의미가 없었습니다. 어쨌든보기를 완전히 새로 고쳤습니다. 왜 다시 실행해야합니까?


1
ATOMIC_REFRESH = false필요할 수 있습니다 (10g 이상). 대기 데이터베이스 또는 아카이브 로그를 사용한 복구에 어떤 영향이 있는지 확실하지 않습니까?
잭 topanswers.xyz 시도라고

내가 한 데이터베이스에서 논리적 및 물리적 대기를 실행합니다. 문제가 없습니다. DB 사본을 만들 때 문제가 발생했습니다. 메모를 봐야하지만 때로는 nologging 테이블이있는 테이블 스페이스에서 복구를 수행 할 때 발생하는 오류가있었습니다. 이러한 문제를 피하기 위해 로깅되지 않은 테이블 / 인덱스에 예약 된 테이블 스페이스를 만드는 권장 사항을 읽었습니다. 나는 그것을 해결하는 방법을 알아 냈습니다.
DCookie

@ 잭, 나는 원자가 아닌 새로 고침을 사용해야한다고 생각합니다.
DCookie

흠, 표준 구체화 된 뷰를 사용하는 경우 원자 새로 고침을 수행해야하므로 이것이 작동하지 않습니다. 다른 사람이 유용하다고 생각할 수 있으므로 여전히 좋은 대답입니다.
레이 리펠

원자 새로 고침이 필요한 이유는 무엇입니까? 내가 이해하는 것처럼 false로 설정하면 전체 새로 고침에만 영향을 미칩니다. 이 asktom 포스트를보십시오 : asktom.oracle.com/pls/apex/…
DCookie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.