DataBase

[SQL] Direct Path I/O란?

부지런한피로 2025. 3. 12. 05:00

💡 Direct Path I/O버퍼 캐시(Buffer Cache)를 거치지 않고 직접 디스크에서 데이터를 읽거나 쓰는 방식입니다.
일반적인 데이터베이스 I/O는 버퍼 캐시를 거쳐 메모리에서 처리되지만, Direct Path I/O는 메모리를 우회하여 SGA를 거치지 않고 PGA(Process Global Area)로 직접 데이터를 로드합니다.

 

 

🔸 1. Direct Path I/O의 동작 방식

(1) 일반적인 I/O (Buffer Cache I/O)와 차이점

구분 일반적인 I/O (SGA 기반) Direct Path I/O
캐시 사용 여부 버퍼 캐시(Buffer Cache)를 거침 버퍼 캐시를 거치지 않음
메모리 위치 SGA(System Global Area) 사용 PGA(Process Global Area) 사용
속도 상대적으로 느림 (캐시 검색 필요) 빠름 (디스크에서 직접 읽기)
적용되는 작업 대부분의 쿼리 (OLTP) 대량 데이터 조회, 병렬 처리 (OLAP)

 

(2) Direct Path Read (읽기 작업)

  • 버퍼 캐시를 우회하고 디스크에서 데이터를 직접 읽어 PGA로 로드
  • 주로 **대량 데이터 조회 작업(OLAP, 데이터 웨어하우스 쿼리)**에서 사용됨
  • 병렬 처리(Parallel Query) 실행 시 필수적으로 사용됨
  • Full Table Scan 또는 Index Fast Full Scan 시 발생 가능

📌 예제

SELECT /*+ FULL(big_table PARALLEL(4) */ * FROM big_table;
  • FULL(big_table): 테이블 전체 스캔 수행
  • PARALLEL(4): 4개의 병렬 프로세스로 데이터를 Direct Path Read

💡 어떤 경우 Direct Path Read가 발생할까?

  1. 병렬 쿼리 실행 (PARALLEL 힌트 사용)
  2. SGA 공간이 부족할 때
  3. 대용량 테이블을 Full Table Scan 할 때
  4. DB_FILE_MULTIBLOCK_READ_COUNT 값을 높게 설정한 경우
  5. Direct Path Read 힌트 적용 시 (_serial_direct_read=TRUE 설정)

 

(3) Direct Path Write (쓰기 작업)

  • 버퍼 캐시를 거치지 않고 PGA에서 직접 데이터를 디스크로 기록
  • 주로 대량 데이터 적재 작업(Bulk Insert, Direct Load Insert) 시 사용됨
  • INSERT /*+ APPEND */ 또는 ALTER TABLE ... MOVE 시 Direct Path Write가 발생

📌 예제

INSERT /*+ APPEND */ INTO sales_archive SELECT * FROM sales;
  • APPEND 힌트를 사용하면 기존 버퍼 캐시를 거치지 않고 디스크에 바로 쓰기
  • 이 방식은 빠르지만 UNDO를 생성하지 않음 → 롤백 불가

💡 Direct Path Write가 발생하는 경우

  1. 대량 데이터 삽입 (Bulk Insert)
  2. CREATE TABLE AS SELECT (CTAS)
  3. 테이블 이동 (ALTER TABLE ... MOVE)
  4. 병렬 DML 사용 (INSERT /*+ PARALLEL */)

 

🔸 2. Direct Path I/O의 장점과 단점

구분 장점 단점
Direct Path Read - 버퍼 캐시를 거치지 않아 빠름
- 대량 데이터 조회에 유리
- 버퍼 캐시 히트율 저하
- OLTP 환경에서는 부적합
Direct Path Write - 대량 데이터 적재 속도 향상
- 병렬 DML 성능 개선
- Undo/Redo를 최소화하여 롤백 불가
- 기존 트랜잭션과 충돌 가능

 

 

🔸 3. Direct Path I/O 발생 여부 확인 방법

(1) 실행 계획(EXPLAIN PLAN)으로 확인

EXPLAIN PLAN FOR
SELECT /*+ FULL(big_table PARALLEL(4) */ * FROM big_table;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

→ 실행 계획에서 "DIRECT PATH READ", "DIRECT PATH WRITE"가 나타나면 Direct Path I/O 사용 중

 

(2) V$SESSION_WAIT 뷰에서 확인

SELECT event, total_waits, time_waited
FROM V$SESSION_WAIT
WHERE event LIKE 'direct path%';

→ "direct path read", "direct path write" 이벤트가 있으면 Direct Path I/O가 발생하고 있음

 

 

🔸 4. Direct Path I/O 최적화 방법

(1) Direct Path Read 활성화 조건 조정

  • DB_FILE_MULTIBLOCK_READ_COUNT 값을 증가시키면 더 많은 블록을 한 번에 읽을 수 있음
ALTER SYSTEM SET DB_FILE_MULTIBLOCK_READ_COUNT = 128;
  • _serial_direct_read 파라미터를 조정하여 Serial Query에서도 Direct Path Read를 유도 가능
ALTER SESSION SET "_serial_direct_read"=TRUE;

 

(2) Direct Path Write 성능 개선

  • INSERT /*+ APPEND */ 사용 시 NOLOGGING 모드를 활용하면 Redo 로그를 최소화 가능
ALTER TABLE sales NOLOGGING;
INSERT /*+ APPEND */ INTO sales SELECT * FROM big_sales;
  • 병렬 DML 사용으로 더 빠른 적재 수행
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ APPEND PARALLEL(4) */ INTO sales SELECT * FROM big_sales;

 

 

 

(3) Direct Path Read 최소화 (OLTP 환경에서 비활성화)

  • OLTP 환경에서는 Direct Path Read가 캐시 히트율을 낮추고 성능 저하를 유발할 수 있음
  • _serial_direct_read를 비활성화하여 버퍼 캐시를 활용하도록 설정
ALTER SYSTEM SET "+serial_direct_read"=FALSE;

 

 

🔸 5. Direct Path I/O 요약

Direct Path I/O 유형 특징 사용 사례
Direct Path Read 버퍼 캐시를 거치지 않고 디스크에서 직접 읽음 - 병렬 쿼리
- Full Table Scan
- SGA 부족 시
Direct Path Write 버퍼 캐시를 거치지 않고 PGA에서 직접 디스크로 씀 - Bulk Insert
- CTAS (CREATE TABLE AS SELECT)
- APPEND 힌트 사용 시

Direct Path I/O는 대량 데이터 처리에 유리하지만, OLTP 환경에서는 적절히 조정해야 함! 🚀