본문 바로가기

IT/DB

[Oracle] 11g R2 : IGNORE_ROW_ON_DUPKEY_INDEX Hint

 

IGNORE_ROW_ON_DUPKEY_INDEX Hint

 

When a statement of the form INSERT INTO target subquery runs, a unique key for some rows to be inserted might collide with existing rows. Suppose that your application must ignore such collisions and insert the rows that do not collide with existing rows.

Before Oracle Database 11g Release 2, you had to write a PL/SQL program which, in a block with a NULL handler for the DUP_VAL_ON_INDEX exception, selected the source rows and then inserted them, one at a time, into the target.

As of Oracle Database 11g Release 2, you do not have to write a PL/SQL program. You can use the IGNORE_ROW_ON_DUPKEY_INDEX hint in an INSERT statement, which is easier to write and runs much faster. This hint is especially helpful when implementing crossedition triggers.

For more information, see "Handling Data Transformation Collisions".

 

 

 

 

중복키 무시 힌트(IGNORE_ROW_ON_DUPKEY_INDEX)

 

‘INSERT INTO 테이블A SELECT .. FROM 테이블B’로 데이터 입력 시에 기존 데이터와 UNIQUE 키에 위배된 중복된 로우가 발생할 시에는 작업 전체가 중복키 에러를 발생시키면서 실패한다.
따라서 대량의 배치로 INSERT 시에는 이러한 UNIQUE 에러가 발생하는 것을 막기 위해 로우 단위 패치를 통하거나 중복 체크를 로직에서 수행한 후에 작업했다. 이번에 신규로 추가되는 IGNORE_ROW_ON_DUPKEY_INDEX 힌트를 사용한다면 키가 중복될 경우 에러가 발생되지 않고 KEY에 중복되지 않은 로우만을 입력할 수 있다.

INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(A, PK_EMP) */ INTO EMP A SELECT * FROM EMP_T;

기존 10g에서부터 지원하는 ERROR LOGGING 기능을 이용해 처리했던 부분이 이 힌트 사용으로 부분 대체되는 역할을 수행한다. 다만 SINGLE INSERT 문에만 적용되고 UPDATE, DELETE, MERGE, MULTI INSERT 구문에서는 지원하지 않는다는 것과 APPEND, PARALLEL 힌트를 함께 사용하면 이 2개의 힌트가 무시되어 <화면 1>의 실행계획에서 나타나듯이 처리 속도가 빠른 DIRECT PATH LOAD(버퍼를 경유하지 않은 처리)가 아닌 CONVENTIONAL 모드만 지원하는 것이 아쉬운 점 가운데 하나이다.

 

BUG REPORT

테스트 환경

- ORACLE 11G STANDARD, ENTERPRISE

문제

- 중복 데이터가 한개라도 존재할 경우, 데이터 건수 255건 까지만 처리 가능...

- Why???