언제 Conventional Data Load를 사용해야 하나?
만약에 데이터 적재 속도가 가장 중요하다면 direct path를 사용해야 한다. conventional path load보다 더 빠르기 때문이다. 그러나 direct path에 특정 제약조건이 있기 때문에 conventional path load를 사용해야 한다. 앞으로는 CPL을 conventional path load라고 하고 DPL을 direct path load라고 하겠다.
구분 |
conventional path load |
direct path load |
속도 |
느림 |
빠름 |
가용성 |
로드 작업중 다른 유저가 테이블 수정 가능(가용성up) |
로드 작업 중 다른 유저가 테이블 변경 불가(가용성down) |
클러스터 테이블 |
클러스터 테이블에 load 가능 |
클러스터 테이블에 load 불가 |
인덱스 관련 |
인덱스가 걸린 큰 테이블에 소량의 행을 load할 경우(append) 유리 |
DPL에서는 인덱스를 로드 종료 후에 병합하는데 이때 기존 인덱스를 복사하고 병합한다. 만약 기존 인덱스가 크고 새로운 인덱스 키들이 작을 경우 DPL의 빠른 속도는 기존 인덱스를 복사하는 시간에 의해 상쇄 될 것이다. |
제약조건 |
비교적 적은 수의 행을 큰 테이블에 로드하는데 참조 제약조건과 check 제약조건이 걸려있을 경우 CPL을 사용해야 한다. |
DPL에서는 PRIMARY KEY, UNIQUE, NOT NULL만 검증한다. |
INSERT 트리거 |
실행됨 |
실행되지 않음 |
Direct Path Load 장점
DPL은 CPL보다 빠른데 그 이유는 다음과 같다.
n 부분적인 블럭들은 사용되지 않는다, 그래서 읽을 블락을 찾을 필요가 없고 적은 쓰기만 수행된다.
n INSERT가 사용되지 않는다.
n 로드 시작전에 테이블과 INDEX를 LOCK하고 로드가 끝난뒤에 LOCK을 푼다.
n 데이터파일에 대해 MULTIBLOCK ASYNCHRONOUS I/O를 사용한다.
n DPL 도중에 프로세스들은 오라클의 버퍼캐시를 사용하는 대신 각자의 쓰기 I/O를 수행한다. 이는 다른 오라클 유저와의 경합을 줄인다.
n 적재되는 테이블이 비어있으면 사전정렬 옵션이 인덱스 생성의 정렬과 병합 단계를 제거한다. 인덱스는 데이터가 도착하는대로 채워진다.
n 인스턴스 장애에 대한 보호가 요구되지 않기에 리두 파일의 IO가 줄어든다. 다음 상황에서 로그파일에 쓰기 과정이 필요없다.
n DB가 NOARCHIVELOG 모드일 때
n SQL*Loader의 UNRECOVERABLE 문이 활성화되었을 때
n SQL에 NOLOGGING이 적용되었을 경우
Direct Path Load의 제약사항
n 클러스터테이블에는 적재될 수 없다.
n Virtual Private Database(VPD) 정책이 Insert에 활성화된 테이블에는 적재될 수 없다
n 적재되어야할 세그먼트에 트랜잭션이 추가될 수 없다.
n 부모 테이블과 자식 테이블을 함께 적재할 수 없다.
n BFILE 컬럼을 로딩할 수 없다.
n 적재 중에 CREATE SEQUENCE를 사용할 수 없다. DPL은 insert 문을 생성하지 않고 로드를 진행하기 때문에 next value를 불러올 수 없다.
Direct Path Load의 Single Partition 제약사항
n 글로벌 인덱스를 가지고 있는 파티션에는 적재할 수 없다,
n 트리거 활성화 불가하다
n 참조와 체크조건이 걸려있는 테이블의 파티션에 대한 적재를 할 수 없다.
언제 Direct Path Load를 사용해야 하나?
만약 위의 제약사항에 해당되지 않는다면 아래 상황에서 direct path를 사용하는 것이 좋다.
n 많은 데이터를 빠르게 적재하고 싶을 때,
n 데이터 로드시 성능을 최대로 써서 병렬로 진행하고 싶을 때
Direct Path Load 주의사항
n Check와 참조무결성 제약조건은 DPL시에 자동으로 적재시작 전에 비활성화되며, 적재 완료 후에 반드시 수동으로 활성화시켜야 한다. 이를 자동으로 활성화하게 하려면 REENABLE DISABLED_CONSTRAINTS 절을 컨트롤 파일에 기록해줘야 한다.
n Check 제약조건은 EVALUDATE CHECK_CONSTRAINTS를 컨트롤 파일에 기록하면 비활성화하지 않게 할 수 있다.
n INSERT 트리거는 적재 시작전에 비활성화된다. 그리고 적재 완료 후에 자동으로 활성화된다. 즉 그 동안 INSERT된 행들에 대한 트리거는 동작하지 않는다.
n 테이블의 DEFAULT는 DPL에선 사용할 수 없다. 이를 DEFAULT 적용하려면 DEAFULTIF 를 사용해야 한다. DEFAULTIF를 쓰지 않으면 NULL이 입력된다.
이 외에도 많은 내용이 더 있다.
http://docs.oracle.com/cd/E11882_01/server.112/e22490/ldr_modes.htm#SUTIL009
'Knowledge > Oracle' 카테고리의 다른 글
impdp, imp 주의사항 (0) | 2016.03.20 |
---|---|
Oracle Create Table 내부 절차 (0) | 2015.10.21 |
undo 관련 좋은 링크 (0) | 2015.09.15 |
null 관련 주의사항 (0) | 2015.07.10 |
logon trail trigger on oracle (0) | 2015.01.22 |