대량 적재와 Direct Path
APPEND와 병렬 DML, 적재 전후 제약조건, 인덱스 처리 흐름
#핵심 요약
실습에서는 INSERT SELECT에 APPEND를 사용하는 예와 병렬 힌트, 세션 병렬 DML 활성화를 별도로 제시함
대량 적재 전후 제약조건과 인덱스의 상태, 복구 작업을 구분해 설명함
#개념과 동작 원리
| 적재 단계 | 처리 동작 |
|---|---|
| 빈 대상 준비 | 조건이 항상 거짓인 CTAS로 대상 테이블 구조 준비 |
| 데이터 입력 | APPEND 힌트를 둔 INSERT SELECT |
| 병렬 준비 | 세션 병렬 DML 활성화와 대상, 소스 병렬 힌트 |
| 제약 해제 | DISABLE DROP INDEX 또는 비고유 인덱스 구성 예의 DISABLE KEEP INDEX |
| 인덱스 처리 | UNUSABLE 지정, USER_INDEXES 상태 조회, REBUILD ONLINE |
| 제약 복귀 | ENABLE NOVALIDATE 예 |
수업 자료에는 병렬 DML이 CPU와 프로세스를 더 사용하므로 다른 작업의 실행 시간대를 고려하라는 설명이 있음
#주요 용어와 구성 요소
| 구문 | 의미 |
|---|---|
| APPEND | INSERT SELECT에 Direct Path를 요청하는 힌트이며 제한 조건에 따라 직렬 일반 INSERT로 처리될 수 있음 |
| NOVALIDATE | 기존 행의 제약 충족을 보장하지 않으며 새 DML에는 제약을 적용함 |
| 제약과 인덱스 | PK, UNIQUE 제약 상태와 그 제약을 지원하는 인덱스 존재, 유효성은 별도 확인임 |
#필수 명령어 또는 SQL
| 항목 | 실행 조건 |
|---|---|
| 작업 대상 | dept_tobe, emp_copy 적재와 target의 PK, 인덱스 상태 |
| 필요 권한 | 테이블 생성, 대상 INSERT, 소스 조회, 인덱스 생성, ALTER 조건을 구분하고 저장 공간 할당이 필요함 |
| 바꿀 입력값 | target, source, 제약, 인덱스명, 병렬도와 대상 열 대응 |
| 결과 해석 | 구문과 상태 해석을 보완한 것이며 실제 계획, 성능 향상, 제약 복귀 후 정합성 결과는 확인 불가 |
CREATE TABLE dept_tobe AS SELECT * FROM dept WHERE 1 = 2;
INSERT /*+ append */ INTO dept_tobe
SELECT * FROM dept;
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ parallel(e1, 4) */ INTO emp_copy e1
SELECT /*+ parallel(e2, 4) */ * FROM emp e2;결과 해석:
병렬 힌트만 주고 ALTER SESSION ENABLE PARALLEL DML을 빼면 SELECT만 병렬이고 INSERT는 직렬로 돌며, 오류도 없고 결과도 정상이라 놓치기 쉬움
수업 자료는 커밋 전에 그 테이블을 조회해 ORA-12838이 나면 Direct Path로 들어간 것으로 확인함
#제약과 인덱스를 끄고 적재
-- 1) PK 인덱스까지 지우고 끄기
ALTER TABLE target MODIFY CONSTRAINT target_pk DISABLE DROP INDEX;
ALTER INDEX target_x1 UNUSABLE;
SELECT index_name, status FROM user_indexes WHERE table_name = 'TARGET';
-- (적재)
ALTER TABLE target MODIFY CONSTRAINT target_pk ENABLE NOVALIDATE;
ALTER INDEX target_x1 REBUILD ONLINE;
-- 2) 비고유 인덱스로 PK를 받쳐 인덱스는 남기고 끄기
CREATE INDEX target_pk ON target (no, empno);
ALTER TABLE target ADD CONSTRAINT target_pk PRIMARY KEY (no, empno) USING INDEX target_pk;
ALTER TABLE target MODIFY CONSTRAINT target_pk DISABLE KEEP INDEX;
ALTER INDEX target_pk UNUSABLE;
ALTER INDEX target_x1 UNUSABLE;
INSERT /*+ append */ INTO target
SELECT * FROM source;
ALTER INDEX target_x1 REBUILD ONLINE;
ALTER INDEX target_pk REBUILD ONLINE;
ALTER TABLE target MODIFY CONSTRAINT target_pk ENABLE NOVALIDATE;결과 해석: USER_INDEXES.STATUS가 UNUSABLE이면 적재 동안 인덱스를 유지하지 않고, REBUILD 뒤 VALID로 돌아옴ENABLE NOVALIDATE는 이후 들어오는 데이터만 검사하고 이미 적재된 행은 검사하지 않음
PK가 고유 인덱스를 쓰면 DISABLE 때 인덱스가 지워지므로, 인덱스를 남기려면 실습처럼 비고유 인덱스를 먼저 만들고 USING INDEX로 PK에 연결한 뒤 DISABLE KEEP INDEX를 씀
#구문과 옵션 설명
Direct Path는 기존 데이터 뒤에 적재하며 같은 트랜잭션에서 적재 후 해당 데이터에 다시 접근하려면 먼저 COMMIT해야 함
트리거, 참조 무결성 제약 등 적용 제한을 확인해야 하며 힌트 존재만으로 실행 방식을 판정하지 않음
PK를 다시 켤 때 사용할 인덱스가 없으면 고유 인덱스를 생성하므로 NOVALIDATE만으로 중복 데이터의 인덱스 생성 문제까지 없앨 수 없음
#사용 조건과 주의사항
실습에서는 커밋 전 조회의 ORA-12838을 Direct Path, 병렬 실행 확인으로 설명하지만 실제 실행계획과 세션 출력이 없음
실제 실행 방식은 실행계획과 세션 통계도 확인해야 함
실습 대상의 전체 트리거, 참조 제약, 로그 모드와 힌트의 실제 적용 여부는 확인 불가
적재 성공, 성능 개선 수치와 제약 복귀 후 데이터 정합성 결과는 확인 불가