Oracle에서는 병렬 INSERT를 통해 데이터를 빠르게 삽입할 수 있습니다. 일반적인 INSERT
작업은 단일 세션에서 수행되지만, 병렬 처리(Parallel Processing)를 이용하면 여러 개의 프로세스가 동시에 데이터를 삽입하여 성능을 향상시킬 수 있습니다.
1. 병렬 INSERT 개념
병렬 INSERT는 여러 개의 병렬 프로세스를 활용하여 데이터를 삽입하는 기법입니다. Oracle은 데이터를 블록 단위로 나누고 여러 개의 프로세스가 동시에 데이터를 쓰도록 하여 성능을 극대화합니다.
✔ 주요 특징
PARALLEL
힌트를 사용하여 여러 프로세스가 동시에 데이터를 삽입- DIRECT PATH INSERT 방식으로 수행되며, 기존 블록을 재사용하지 않고 새로운 블록에 데이터를 저장
- 로그 기록 최소화 (NOLOGGING 옵션 사용 가능)
- 트랜잭션 커밋 전까지 다른 세션에서 삽입된 데이터를 볼 수 없음
2. 병렬 INSERT 문법
병렬 INSERT는 세션 단위 설정 또는 SQL 단위 설정 방식으로 사용할 수 있습니다.
(1) 세션 단위 병렬 설정
ALTER SESSION ENABLE PARALLEL DML;
- 병렬 DML을 수행하려면 세션에서 PARALLEL DML을 활성화해야 합니다.
- 이 설정을 하지 않으면
PARALLEL
힌트를 사용해도 병렬 처리가 되지 않습니다.
(2) 병렬 INSERT 기본 문법
INSERT /*+ APPEND PARALLEL(t, 4) */ INTO target_table t
SELECT * FROM source_table;
APPEND
힌트: DIRECT PATH INSERT를 강제함PARALLEL(t, 4)
:target_table
을 4개의 프로세스가 병렬로 처리
3. 병렬 INSERT 예제
(1) 기본 병렬 INSERT 예제
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ APPEND PARALLEL(emp, 4) */ INTO emp
SELECT * FROM emp_backup;
emp_backup
테이블에서 데이터를 읽어와 4개의 병렬 프로세스를 사용하여emp
테이블에 삽입
(2) NOLOGGING 옵션과 함께 사용
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ APPEND PARALLEL(sales, 8) */ INTO sales NOLOGGING
SELECT * FROM sales_backup;
- NOLOGGING 옵션을 사용하여 REDO 로그 최소화
- 8개의 병렬 프로세스를 사용하여
sales
테이블에 데이터 삽입
(3) 특정 조건을 적용한 병렬 INSERT
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ APPEND PARALLEL(customers, 6) */ INTO customers
SELECT customer_id, name, region
FROM customer_staging
WHERE status = 'NEW';
customer_staging
테이블에서status = 'NEW'
조건을 만족하는 데이터를customers
테이블에 삽입- 병렬 6개 프로세스를 사용하여 성능 향상
4. 병렬 INSERT 주의사항
- SEQUENCE 사용 시 주의
병렬 INSERT는 여러 프로세스가 동시에 실행되므로, SEQUENCE를 사용할 때 충돌이 발생할 수 있음- 해결 방법:
CACHE
옵션을 사용하여 동시성을 보장
CREATE SEQUENCE my_seq CACHE 1000;
- 해결 방법:
- INDEX 유지 관리
- 병렬 INSERT는 기존 INDEX를 무효화할 수 있음
- INSERT 후 INDEX 재구성 필요 (
ALTER INDEX REBUILD
)
- APPEND 힌트 사용 시 ROLLBACK 불가
APPEND
는 DIRECT PATH를 사용하므로 ROLLBACK이 불가능- 트랜잭션이 실패하면 테이블을 TRUNCATE 후 다시 INSERT해야 함
- 테이블 잠금(Locking) 이슈
- 병렬 INSERT는 해당 테이블을 EXCLUSIVE MODE로 잠금
- 동시에 다른 세션에서 DML(UPDATE, DELETE) 작업을 수행하면 충돌 가능
5. 성능 비교 (병렬 vs 단일 프로세스)
방식 | 처리 시간 | CPU 사용량 | REDO 로그 발생량 |
---|---|---|---|
단일 INSERT | 느림 | 낮음 | 많음 |
병렬 INSERT | 빠름 | 높음 | 적음 (NOLOGGING 사용 시) |
6. 병렬 INSERT 성능 최적화
(1) 적절한 병렬도 설정
- 시스템 리소스를 고려하여 최적의 병렬도 설정 (
PARALLEL(t, N)
) - 일반적으로 CPU 코어 수의 2배 이하로 설정
(2) NOLOGGING 사용
NOLOGGING
옵션을 적용하면 REDO 로그를 최소화하여 성능 개선 가능- 단, 데이터 복구가 불가능하므로 주의
(3) TABLESPACE 관리
- ASSM(Automatic Segment Space Management) 사용sql복사편집
ALTER TABLE my_table STORAGE (FREELISTS 1);
- 병렬 프로세스가 블록을 경합하지 않도록 설정
(4) DIRECT PATH 사용 강제
APPEND
힌트를 사용하여 Direct Path Load 방식 적용
7. 정리
항목 | 내용 |
---|---|
병렬 INSERT 사용 조건 | ALTER SESSION ENABLE PARALLEL DML 필요 |
DIRECT PATH 사용 | APPEND 힌트 적용 시 가능 |
INDEX 영향 | 기존 INDEX가 무효화될 수 있음 (재구성 필요) |
SEQUENCE 주의점 | CACHE 설정 권장 |
트랜잭션 처리 | APPEND 사용 시 ROLLBACK 불가 |
Oracle 병렬 INSERT는 대량의 데이터를 삽입할 때 강력한 성능 향상을 제공하지만, 적절한 튜닝과 주의사항을 고려해야 합니다. 🚀