1. 개요
Direct Path I/O는 Oracle이 데이터를 디스크에서 읽거나 디스크에 쓸 때, 버퍼 캐시(Buffer Cache)를 거치지 않고 직접 데이터 파일에 접근하는 방식입니다. 주로 대용량 데이터 로드, Direct Path Insert, 병렬 처리에서 사용되며, 기존 I/O보다 성능이 뛰어납니다.
✅ Direct Path I/O 주요 특징
- 버퍼 캐시를 거치지 않고 직접 디스크에 데이터 저장
- Redo/Undo 사용 최소화 가능
- 병렬 처리와 결합 가능
- 주로 Direct Path Load (
INSERT /*+ APPEND */
등)에서 사용됨 - ASM(Automatic Storage Management) 및 Exadata와 같은 환경에서 최적화됨
2. Direct Path I/O vs. Conventional I/O 비교
항목 | Direct Path I/O | Conventional (Buffered) I/O |
---|---|---|
데이터 처리 방식 | 데이터 파일에 직접 쓰기 | 버퍼 캐시(BUFFER CACHE) 사용 |
속도 | 빠름 (병렬 지원) | 상대적으로 느림 |
Redo Log | 최소화 가능 (NOLOGGING 사용 시) | 항상 발생 |
Undo 사용 | 최소화됨 | 일반적인 DML 수준 |
트랜잭션 ROLLBACK | APPEND 사용 시 불가 | 가능 |
병렬 처리 | 가능 | 기본적으로 단일 프로세스 |
3. Direct Path I/O를 사용하는 작업
Direct Path I/O는 다음과 같은 작업에서 주로 사용됩니다.
(1) Direct Path Insert (INSERT /*+ APPEND */
)
- 기존 블록을 수정하지 않고 새로운 블록을 직접 할당하여 데이터 삽입
- Redo Log를 최소화할 수 있음 (
NOLOGGING
사용 시) - 병렬 INSERT와 함께 사용 가능
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ APPEND PARALLEL(t, 4) */ INTO target_table t
SELECT * FROM source_table;
APPEND
를 사용하면 버퍼 캐시를 거치지 않고 데이터를 테이블에 저장- 병렬 4개의 프로세스를 사용하여 데이터 적재
(2) Direct Path Load (SQL*Loader DIRECT=TRUE
)
- SQL*Loader에서
DIRECT=TRUE
옵션을 사용하면 Direct Path I/O를 수행 - 대량의 데이터를 로드할 때 Redo/Undo 최소화 가능
sqlldr userid=user/password control=control.ctl direct=true
(3) Parallel Query (SELECT /*+ PARALLEL */
)
- Oracle의 병렬 쿼리 실행 시 Direct Path Read를 사용
- 데이터를 버퍼 캐시에 로드하지 않고 바로 클라이언트로 전송
SELECT /*+ PARALLEL(emp, 4) */ * FROM emp;
(4) Direct Path Table Scan (Full Table Scan)
- 대량의 데이터를 조회할 때 Oracle이 자동으로 Direct Path Read를 수행
- 테이블 크기가 크고, 인덱스가 없을 때 Full Table Scan 발생
- Direct Path Read 활성화 조건
- 테이블이 병렬 모드로 설정됨 (
ALTER TABLE PARALLEL
) - SGA(Buffer Cache)를 우회하도록 설정됨 (
_serial_direct_read
활성화) - Exadata Smart Scan 등 일부 환경에서 자동 적용됨
- 테이블이 병렬 모드로 설정됨 (
4. Direct Path I/O 튜닝 방법
(1) NOLOGGING 활성화
- Redo 로그를 최소화하여 성능 최적화
ALTER TABLE my_table NOLOGGING;
NOLOGGING
을 사용하면 장애 발생 시 데이터 복구가 불가능하므로 주의
(2) 병렬 처리 활성화
- 병렬 쿼리 또는 병렬 DML을 사용하여 Direct Path I/O 활용
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ APPEND PARALLEL(sales, 8) */ INTO sales
SELECT * FROM sales_backup;
(3) Table-Level Parallelism 적용
ALTER TABLE sales PARALLEL 8;
- 병렬 테이블 스캔 시 Direct Path Read가 활성화될 확률 증가
(4) Direct Path Read 강제 설정
_serial_direct_read
히든 파라미터를 조정하여 Serial Direct Path Read 활성화
ALTER SESSION SET "_serial_direct_read"=true;
- 주의: Oracle 버전에 따라 기본적으로 Direct Path Read가 활성화될 수도 있음
5. Direct Path I/O의 한계 및 고려사항
- SGA(Buffer Cache) 활용 불가
- Direct Path I/O는 버퍼 캐시를 우회하므로 자주 조회되는 데이터에는 비효율적
- OLTP 시스템(트랜잭션 위주 시스템)에서는 권장되지 않음
- DSS(Decision Support System)나 DW(Data Warehouse) 환경에서 유용함
- NOLOGGING 사용 시 데이터 복구 불가
- 장애 발생 시 Redo Log가 없으므로 데이터 복구가 어려움
- 중요한 데이터는
LOGGING
을 유지하거나 백업 필요
- **Rollback 불가능 (INSERT /+ APPEND / 사용 시)
- Direct Path Insert는 UNDO를 최소화하므로 ROLLBACK이 불가능
- 데이터를 잘못 삽입하면
DELETE
또는TRUNCATE
로 제거해야 함
- Index 무효화 가능성
- Direct Path Insert 수행 시 기존 인덱스가 비활성화될 수 있음
ALTER INDEX REBUILD;
를 수행하여 인덱스를 다시 활성화해야 함
6. 결론
✅ Direct Path I/O는 대량 데이터 로드, 병렬 쿼리, Direct Path Insert에서 뛰어난 성능을 제공하며, 특히 DSS/DW 환경에서 강력한 성능 최적화를 가능하게 함
❗ 하지만 Rollback이 불가능하고, SGA(Buffer Cache)를 활용할 수 없으며, NOLOGGING 사용 시 복구가 어렵다는 점을 고려해야 함