h2.Direct Path I/O
- 일반적은 블록 I/O는 버퍼 캐시를 경우 한다.
- 오라클은 버퍼 캐시를 경유하지 않고 곧바로 데이터 블록을 읽고 쓸 수 있는 Direct PATH I/O 기능을 제공한다.
- Direct Path I/O가 작동하는 경우
- Temp 세그먼트 블록들을 읽고 쓸 때
- 병렬 쿼리로 Full Scan을 수행 할 때
- Nocache 옵션을 지정한 LOB 컬럼을 읽을 때
- Direct 옵션을 지정하고 export를 수행할 때
- Parallel DML을 수행할 때
- Direct Path Insert를 수행할 때
(1) Direct Path Read/Write Temp
- 데이터를 정렬할 때는, PGA 메모리에 할당되는 Sort 를 이용하고 정렬할 데이터가 많아 Sort Area가 부족해지면 Temp 테이블스페이스를 이용한다.
- 이때 Sort Area에 정렬된 데이터를 Temp 테이블 스페이스에 쓰고 이를 다시 읽을 때 Direct Path I/O방식을 사용한다.
- 이 과정에서 I/O Call이 완료될 때까지 대기가 발생하는데, direct path write temp 와 direct path read temp 이벤트로 측정된다.
(2) Direct Path Read
- 병렬 쿼리로 Full Scan을 수행할 때도 Direct Path Read 방식을 사용한다.
- Direct Path Read과정에서 읽기 Call이 완료될 때까지 대기가 발생하는데, direct path read 이벤트로 측정된다.
- 버퍼 캐시에만 기록된 변경사항이 아직 데이터파일에 기록되지 않는 상태에서 데이터 파일을 직접 읽으면 정합성에 문제가 생긴다. 그러므로 Direct Path Read를 수행하려면 메모리와 디스크간 동기화를 먼저 수행함으로써 Dirty 버퍼를 해소해야 한다.
- 10g R2이전에는 CKPT를 발생하여 버퍼 캐시 전체를 데이터파일에 기록 했지만 10g R2부터는 병렬 쿼리와 관련된 세그먼트만 동기화를 수행한다.
(3) Direct Path Write
- Direct Path Write는 병렬로 DML을 수행하거나 Direct Path Insert 방식으로 데이터를 insert 할 때 사용된다.
- 이 과정에서 I/O Call이 발생할 때마다 direct path write 이벤트가 나타난다.
- Direct Path Insert 방식으로 데이터를 입력하는 방식은 아래와 같다.
- Insert...select 문장에 /*+ append */ 힌트 사용
- 병렬모드로 insert
- Direct 옵션을 지정하고 SQL*Loader(sqlldr)로 데이터를 로드
- CTAS(create table... as select) 문장을 수행
- Conventional insert 시에는 Freelist를 통해 데이터를 삽입할 블록을 할당받는다. Freelist를 조회하면서 Random 액세스 방식으로 버퍼 캐시에서 해당 블록을 찾고, 없으면 데이터파일에서 읽어 캐시에 적재한 후에 데이터를 삽입하므로 대량의 데이터를 insert 할 때 매우 느리다.
- Direct Path Insert시에는 Freelist를 참조하지 않고 테이블 세그먼트 또는 각 파티션 세그먼트의 HWM바깥 영역에 데이터를 순차적으로 입력한다.
- Direct Path Insert에서는 Redo와 Undo 엔트리를 로깅하지 않도록 옵션을 줄 수도 있어 훨 씬 빠르다.
alter table t NOLOGGING;
insert into t NOLOGGING select * from test;
- 이런 경우는 nologging은 T 테이블에 대한 별칭 일 뿐 nologging 기능과는 무관하다.
alter session enable parallel dml;
Delete /*+ parallel(b 4) */ from big_table b; -> Exclusive 모드 TM LOCK!!
- Direct Path Insert 방식으로 데이터를 입력하면 Exclusive 모드 테이블 Lock이 걸린다. 즉, 다른 트랜잭션이 수행할 수 없다.
문서에 대하여
- 최초작성자 : 미녀씨
- 최초작성일 : 2010년 01월 15일
- 이 문서는 오라클클럽 코어 오라클 데이터베이스 스터디 모임에서 작성하였습니다.
- {*}이 문서의 내용은 (주)비투엔컬설팅에서 출간한 '오라클 성능 고도화 원리와 해법I'를 참고하였습니다.*