0
10 밀리 이상의 레코드가있는 테이블이 있으며 레코드 수가 많은 다른 몇 테이블에서 가져온 데이터에서이 테이블의 여러 열을 업데이트해야합니다. 모든 테이블에 인덱스가 붙어 있습니다.대용량 레코드 업데이트
나는 일괄 처리를하고 동시 세션에서 업데이트를 시도했지만 매우 오랜 시간이 걸렸습니다. 이 문제에 대한 대체 접근법이 있습니까?
10 밀리 이상의 레코드가있는 테이블이 있으며 레코드 수가 많은 다른 몇 테이블에서 가져온 데이터에서이 테이블의 여러 열을 업데이트해야합니다. 모든 테이블에 인덱스가 붙어 있습니다.대용량 레코드 업데이트
나는 일괄 처리를하고 동시 세션에서 업데이트를 시도했지만 매우 오랜 시간이 걸렸습니다. 이 문제에 대한 대체 접근법이 있습니까?
해결 방법은 새로운 테이블 (nologging 포함)을 만들고 병렬 처리하는 것입니다.
1) 먼저 어떤 행과의 더미 보류 테이블()를 생성합니다
create table xyz_HOLD as select * from xyz where rownum<1피가 모든 작업 * ...
nologging
와
Alter table xyz_HOLD nologging
*, 시스템 중단하는 경우, 당신은 단순히 로깅 재 - 실행 '갱신'당신이 할 기본 테이블
2)
insert /*+ append parallel (xyzhold,12) */ into xyz_hold xyzhold (field1, field2, field3) select /*+ parallel (x,12) */ xyz.field1, my_new_value_for_field2, xyz.field3 from xyz x where blah blah blah
3)에서 원래의 데이터가 어느 테이블의 이름을 변경하거나 파티션을 스왑으로 다시 원래의 테이블이 페이지 인 경우 우리는 파티션을 하나만 업데이트했습니다.
+) 물론 나중에 필요한 경우 indecies 등을 다시 작성해야합니다.
AskTom의 John Bittner가 작성한이 주석을 확인하십시오. http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:6407993912330 –
그리고 여러 테이블에서 여러 컬럼을 업데이트 할 때 테이블을 생성하는 데 여전히 많은 시간이 걸립니다. – chapter473
테이블을 만드는 데 오랜 시간이 걸리므로 작업이 거의 즉시 이루어져야합니다. 이 테이블을 만들고 계십니까? xyz에서 select *로 테이블 xyz_HOLD를 만드시겠습니까? 어디에서 rownum <1? 그렇다면 'tablexyz nologging 변경'과 같이 변경 하시겠습니까? 또한, 그들이 사용하는 힌트를주의하십시오. –