데이터베이스 연구실.log

대량 적재와 Direct Path

APPEND와 병렬 DML, 적재 전후 제약조건, 인덱스 처리 흐름

APPEND병렬 DMLUNUSABLENOVALIDATE

#핵심 요약

실습에서는 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, 제약, 인덱스명, 병렬도와 대상 열 대응
결과 해석 구문과 상태 해석을 보완한 것이며 실제 계획, 성능 향상, 제약 복귀 후 정합성 결과는 확인 불가
SQL*Plus (대상 테이블 소유자)객체 또는 설정을 변경함
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로 들어간 것으로 확인함

#제약과 인덱스를 끄고 적재

SQL*Plus (대상 테이블 소유자)객체 또는 설정을 변경함
-- 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, 병렬 실행 확인으로 설명하지만 실제 실행계획과 세션 출력이 없음
실제 실행 방식은 실행계획과 세션 통계도 확인해야 함

실습 대상의 전체 트리거, 참조 제약, 로그 모드와 힌트의 실제 적용 여부는 확인 불가

적재 성공, 성능 개선 수치와 제약 복귀 후 데이터 정합성 결과는 확인 불가

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기