데이터베이스에서 DML(INSERT, UPDATE, DELETE) 구문은 단순히 데이터를 수정하는 역할로만 보일 수 있지만, 대량 작업이나 실시간 트랜잭션 환경에서는 성능 병목의 주요 원인이 될 수 있습니다. 이번 글에서는 DML 성능을 최적화하기 위한 주요 기법과 실무 적용 팁을 정리하겠습니다.
DML 성능 저하 원인
- DML 작업이 느려지는 이유는 주로 다음과 같습니다.
- 인덱스 오버헤드 : UPDATE나 DELETE 시, 해당 테이블에 걸린 모든 인덱스를 갱신해야 함.
- 잠금(Lock) 경합 : 동시에 여러 세션이 같은 데이터를 수정하려고 할 때 대기 시간 증가.
- 로그 기록 부담 : 변경 이력(REDO, UNDO 로그) 기록이 많을수록 처리 속도 저하.
- 트리거(Trigger) 및 제약조건(Constraint) : 불필요하거나 비효율적인 제약조건 검증이 추가 수행됨.
INSERT 튜닝 방법
대량 데이터 입력 시 속도를 높이기 위해 다음 방법을 고려합니다.
1. Direct-Path Insert 사용
- Oracle: APPEND 힌트 사용
INSERT /*+ APPEND */ INTO orders SELECT * FROM staging_orders;
- 데이터가 버퍼 캐시를 거치지 않고 직접 디스크에 기록되어 속도가 빨라짐.
- 주의: 다른 세션에서 해당 테이블을 동시에 DML할 수 없음.
2. 인덱스 최소화
- INSERT 시 불필요한 인덱스를 제거하고, 입력 완료 후 인덱스를 재생성하는 것이 더 빠름.
3. 제약조건 지연 적용
- FOREIGN KEY, CHECK 제약조건은 데이터 입력 후 한 번에 검증.
4. 배치(Batch) 처리
- 여러 건의 INSERT를 한 번에 처리
INSERT INTO orders (order_id, amount)
VALUES (:1, :2), (:3, :4), (:5, :6);
UPDATE 튜닝 방법
1. 불필요한 컬럼 수정 방지
- 모든 컬럼을 UPDATE하지 말고, 실제 변경되는 컬럼만 수정.
-- ❌ 비효율적인 방법
UPDATE employees SET name = name, salary = 5000;
-- ✅ 효율적인 방법
UPDATE employees SET salary = 5000 WHERE employee_id = 101;
2. 인덱스 활용
- WHERE 조건절이 인덱스를 탈 수 있도록 설계.
- 대량 업데이트 시 인덱스 사용보다 풀스캔 후 병합이 더 효율적일 수도 있음.
3 병렬 처리(Parallel DML)
Oracle의 경우:
ALTER SESSION ENABLE PARALLEL DML;
UPDATE /*+ PARALLEL(employees, 4) */ employees SET salary = salary * 1.1;
DELETE 튜닝 방법
1. TRUNCATE 활용
모든 데이터를 삭제할 경우:
TRUNCATE TABLE employees;
장점:
- 로그 최소 기록
- 빠른 처리 속도
단점:
- 롤백 불가능
- 제약조건, 트리거 동작 안 함
2. 배치 삭제
- 대량 DELETE 시 한 번에 삭제하지 않고, 일정 건수 단위로 나눠서 처리.
DELETE FROM orders WHERE order_date < '2024-01-01' AND ROWNUM <= 10000;
COMMIT;
3. 인덱스 및 제약조건 고려
- DELETE 시 인덱스와 제약조건 때문에 부하가 커질 수 있음 → 불필요한 인덱스는 삭제.
공통 성능 최적화 팁
- 자동 커밋(Auto Commit) 비활성화 : 대량 DML 시 매 건마다 COMMIT을 하면 성능 저하.
- UNDO/REDO 최소화 : Direct Path, TRUNCATE, CTAS(Create Table As Select) 활용.
- 병렬 처리 : CPU 코어를 활용해 대량 작업 속도 향상.
- 테이블 파티셔닝 : 특정 파티션만 수정/삭제하여 범위를 줄임.
DML 튜닝 비교표
구분 | 주요 성능 저하 원인 | 최적화 방법 |
INSERT | 인덱스 재작성, 제약조건 검증 | Direct-Path, 인덱스 최소화, 배치 처리 |
UPDATE | 불필요한 컬럼 수정, 인덱스 부하 | 필요한 컬럼만 수정, 병렬 처리 |
DELETE | 인덱스/제약조건 부하, 로그 발생 | TRUNCATE, 배치 삭제, 파티션 활용 |
DML 튜닝은 단순히 SQL문을 바꾸는 것이 아니라, 데이터 구조, 인덱스, 트랜잭션 전략까지 함께 고려해야 합니다. 특히 대량 작업 시 배치 처리 + Direct Path + 인덱스 최소화를 조합하면 성능을 크게 향상시킬 수 있습니다.