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가 발생할까?
- 병렬 쿼리 실행 (PARALLEL 힌트 사용)
- SGA 공간이 부족할 때
- 대용량 테이블을 Full Table Scan 할 때
- DB_FILE_MULTIBLOCK_READ_COUNT 값을 높게 설정한 경우
- 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가 발생하는 경우
- 대량 데이터 삽입 (Bulk Insert)
- CREATE TABLE AS SELECT (CTAS)
- 테이블 이동 (ALTER TABLE ... MOVE)
- 병렬 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 환경에서는 적절히 조정해야 함! 🚀