DATOR


UNIQUE INDEX UNUSABLE 상태에서의 INSERT 방안 TIPs


본 글의 주된 내용은 간단하지만 상황적인 이해는 초보자에게는 좀 어려울 것이다. 아래 기술한 내용을 경험하거나 이해할 수 있는 분들을 위한 글이다. 


------------------------------------------------------------------------------------------------------------------------------------------------

1. 인덱스가 존재하면 대용량의 작업 성능은 떨어진다.

2. 파티션된 테이블 중 일부 파티션에 대해서만 대용량 작업을 하기 위해서 일부 파티션의 INDEX만 UNUSABLE로 하면 인덱스로 인한 성능 감소를 해결할 수 있다.

3. 그런데, PRIMARY KEY 에서 사용하는 UNIQUE INDEX 또는 별도의 UNIQUE INDEX가 존재하는 경우에 이 인덱스를 UNUSABLE로 변경하게 되면 INSERT는 불가능하다.(ORA-01502오류 발생)

4. 따라서 UNIQUE INDEX는 USABLE인 상태로 INSERT해야 하는데, 이 때 성능 저하가 발생한다.

------------------------------------------------------------------------------------------------------------------------------------------------

좀 긴 설명이 되었는데, 간단하게 표현하면 UNIQUE INDEX가 UNUSABLE 상태에서 다량의 INSERT작업을 빠르게 수행하고자 할 때 적용 가능한 방법이다.


아이디어는 UNIQUE INDEX가 UNUSABLE 상태에서는 INSERT는 불가능하지만 PARTITION EXCHANGE는 가능하다는 점에서 착안되었다. 단, 작업 대상 파티션을 알고 있어야 한다.


작업 순서는

1. 작업 대상 테이블에 PRIMARY KEY가 걸려 있으면 PK CONSTRAINT DISABLE (UK만 있으면 SKIP)

2. 작업 대상 파티션의 UNIQUE INDEX DISABLE 

3. 작업 대상 테이블과 동일한 구조의 임시 테이블 생성

4. 임시 테이블에 필요 데이터 INSERT

5.  PARTITION EXCHANGE

    ALTER TABLE TARGET_TABLE EXCHANGE PARTITION PARTITION_NAME ...   WITHOUT VALIDATION;

6. 작업 대상 파티션의 UNIQUE INDEX REBUILD

7. PRIMARY KEY ENABLE

의 순서로 수행해 주면 된다. 만약, 작업 대상 파티션이 여러 개라면 위 2 ~ 6번 작업을 파티션 갯수만큼 반복 수행(동시 수행도 가능)하면 된다.


*  작업 대상테이블에 미리 들어 있는 데이터에 대해 추가 작업을 해야 하는 경우라면 3번 작업을 수행하기 전에 PARTITION EXCHANGE를 먼저 수행하여 임시 테이블에 원래의 데이터를 가져온 후 추가작업을 수행할 수 있다.


** 별로 필요성이 크지는 않겠지만 작업 대상 테이블이 파티션 테이블이 아닌 경우에도 UNIQUE INDEX의 UNUSABLE 상태에서 작업을 해야 한다면, 임시 테이블을 파티션으로 만들어 PARTITION EXCHANGE가 가능하게 할 수 있다.


TAG

Leave Comments