2014-10-01 4 views
1

Oracle 11g에서 대형 인덱스 구성 테이블 (2,000 만 행)의 기본 키를 업데이트해야합니다.인덱스 업데이트 여러 개의 UPDATE 쿼리를 사용하여 구성된 테이블 (임시 복사본)

여러 개의 UPDATE 쿼리를 사용하여이 작업을 수행 할 수 있습니까? 즉 한 번에 10 만 줄의 많은 작은 UPDATE가 있습니다. 문제는 이러한 UPDATE 일괄 처리 중 하나가 일시적으로 중복 된 기본 키 값을 생성 할 수 있다는 것입니다 (모든 UPDATE가 완료된 후에는 중복이 발생하지 않을 수 있습니다).

그래서 일시적으로 사용 중지 할 수 있는지 묻습니다 기본 키 제약 조건 (그러나 IOT에 필요합니다!) 또는 다른 방법으로 테이블을 임시로 변경하십시오. 이 테이블에 대해 독점 및 오프라인 액세스 권한을 가질 수 있습니다.

내가 볼 수있는 유일한 해결책은 새 테이블을 만들고 완료되면 원래 테이블을 삭제하고 새 테이블의 이름을 원래 테이블 이름으로 변경하는 것입니다.

다른 가능성이 누락 되었습니까?

답변

0

IOT에서 기본 키 제약 조건을 비활성화/삭제할 수 없습니다. 정의에 따라 고유 인덱스이기 때문에 비활성화 할 수 없습니다.

IOT를 이와 같이 변경해야 할 때 새 일반 힙 테이블에 대해 CTAS (테이블 생성)를 수행하고 유지 관리를 수행 한 다음 새로운 IOT를 CTAS로 수행합니다.

뭔가 같은 :

create table t_temp as select * from t_iot; 
-- do maintenance 
create table t_new_iot as select * from t_temp; 

그러나, 당신은 단순히 추가하거나 기존 키에 새 필드를 가입해야하는 경우에는 다음, 새로운 IOT 구조를 만들어 직접 채워 한 단계에서이 작업을 수행 할 수 있습니다 이전 IOT에서 쿼리로

불행히도, 이것은 IOT의 단점 중 하나입니다.

0

나는 방법에 따라 추천 할 것입니다 :

  1. 가 현재와 완전히 동일한 구조로 단일 파티션 와 시스템에 의해 분할 된 새로운 IOT 테이블을 작성합니다.

  2. DML을 방지하기 위해 현재 IOT 테이블을 잠급니다.

  3. 현재 테이블의 선택으로 새 테이블에 삽입하여 선택의 PK 값을 변경합니다. 이 단계 은 필요한 경우 여러 번 반복 할 수 있습니다. 이 경우 원래 테이블을 잠그기 위해 다른 세션에서 수행하는 것이 더 좋을 것입니다.

  4. 원본 테이블과 새 테이블을 교환 파티션.