Direct Patch IO
Direct Path I/O 작동하는 경우
- Temp 세그먼트 블록들을 읽고 쓸 때
- 병렬 쿼리로 Full Scan을 수행할 때
- nocache 옵션을 지정한 LOB 컬럼을 읽을 때
- direct 옵션을 지정하고 export를 수행할 때
- parallel DML을 수행할 때
- Direct Path Insert를 수행할 때
h5.(1) Direct Path Read!Write Temp
- 데이터를 정렬할 때는, PGA 메모리에 할당되는 Sort Area를 이용한다. Sort Area가 부족해지면 Temp 테이블스페이스를 이용하는데, Sort Area에 정렬된 데이터를 Temp 테이블스페이스에 쓰고 이를 다시 읽을 때 Direct Path I/0 방식을 사용한다
h5.(2) Direct Path Read
- 병렬 쿼리로 Full Scan을 수행할 때도 Direct Path Read 방식을 사용한다. ( 병렬처리시 쿼리 속도만 빨라지는게 아니다.)
- 버퍼 캐시에만 기록된 변경사항이 아직 데이터파일에 기록되지 않은 상태에서 데이터파일을 직접 읽으면 정합성에 문제가 생긴다.
- 병렬로 Direct Path Read를 수행하려면 메모리와 디스크간 동기화를 먼저 수행함으로써 Dirty 버퍼를 해소해야 한다.
Adaptive Direct Path Reads
사실 병렬 쿼리가 아니더라도 오라클 8. 1.5 이후 버전부터는 Hidden 파라미터
_serial direct read를 true로 변경해 Direct Path Read 방식으로 읽도록 할 수 있다.
게다가 11g부터는 이 파라미터가 false인 상태에서도 Serial Direct Path Read 방
식이 작동할 수 있으며 이미 캐싱돼 있는 블록 개수 디스크에 기록해야 할 Dirty
블록 개수(-세그먼트 단위 체크포인트 일끓 결정) 등에 따라 오라클이 결정한다.
h5.(3) Direct Path Write
- Direct Path Write는 병렬로 DML을 수행하거나 Direct Path Insert 방식으로 데이터를 insert 할 때 사용된다.
- 이 과정에서 I/0 Call이 발생할 때마다 direct path write 이벤트가 나타난다.
h5.Direct Path Insert 방식으로 데이터를 입력히는 방법
- insert ... select 문장에 /*+ append * / 힌트 사용
- 병렬 모드로 insert
- direct 옵션을 지정하고 SQL*Loader(sqlldr)로 데이터를 로드
- CTAS(create table ... as select) 문장을 수행
- Freelist를 참조하지 않고 테이블 세그먼트 또는 각 파티션세그먼트의 HWM(가장 마지막 data가 저장되었던 data block의 위치) 바깥 영역에 데이터를 순차적으로 입력한다
- insert 할 블록을 Buffer Cache를 적재하지 않고 직접 입력한다.
- HWM 바깥 영역에 데이터를 입력하므로 Undo 발생량도 최소화된다
h5.Direct Path Insert에서는 Redo 로그까지 최소화
- alter t able t NOLOGGING
- insert into t NOLOGGING select * from test ; ( 잘못된 표현 : NOLOGGING 은 ALIAS )
h5.Direct Path Insert 주의
- Direct Path Insert 방식으로 데이터를 입력하면 Exclusive 모드 테이블 Lock이 걸린다
- 트랜잭션이 잘 일어나지 않는 시간대 사용
- INDEX가 존재하면 DROP 시키고 생성하는것이 좋다 ( Index Maintenance 비용이 더 든다)