DIRECT PATH I/O (Oracle Direct Path I/O)

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/OConventional (Buffered) I/O
데이터 처리 방식데이터 파일에 직접 쓰기버퍼 캐시(BUFFER CACHE) 사용
속도빠름 (병렬 지원)상대적으로 느림
Redo Log최소화 가능 (NOLOGGING 사용 시)항상 발생
Undo 사용최소화됨일반적인 DML 수준
트랜잭션 ROLLBACKAPPEND 사용 시 불가가능
병렬 처리가능기본적으로 단일 프로세스

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의 한계 및 고려사항

  1. SGA(Buffer Cache) 활용 불가
    • Direct Path I/O는 버퍼 캐시를 우회하므로 자주 조회되는 데이터에는 비효율적
    • OLTP 시스템(트랜잭션 위주 시스템)에서는 권장되지 않음
    • DSS(Decision Support System)나 DW(Data Warehouse) 환경에서 유용함
  2. NOLOGGING 사용 시 데이터 복구 불가
    • 장애 발생 시 Redo Log가 없으므로 데이터 복구가 어려움
    • 중요한 데이터는 LOGGING을 유지하거나 백업 필요
  3. **Rollback 불가능 (INSERT /+ APPEND / 사용 시)
    • Direct Path Insert는 UNDO를 최소화하므로 ROLLBACK이 불가능
    • 데이터를 잘못 삽입하면 DELETE 또는 TRUNCATE로 제거해야 함
  4. Index 무효화 가능성
    • Direct Path Insert 수행 시 기존 인덱스가 비활성화될 수 있음
    • ALTER INDEX REBUILD;를 수행하여 인덱스를 다시 활성화해야 함

6. 결론

Direct Path I/O는 대량 데이터 로드, 병렬 쿼리, Direct Path Insert에서 뛰어난 성능을 제공하며, 특히 DSS/DW 환경에서 강력한 성능 최적화를 가능하게 함
❗ 하지만 Rollback이 불가능하고, SGA(Buffer Cache)를 활용할 수 없으며, NOLOGGING 사용 시 복구가 어렵다는 점을 고려해야 함

Leave a Comment