Direct Patch IO

Direct Path I/O 작동하는 경우
  1. Temp 세그먼트 블록들을 읽고 쓸 때
  2. 병렬 쿼리로 Full Scan을 수행할 때
  3. nocache 옵션을 지정한 LOB 컬럼을 읽을 때
  4. direct 옵션을 지정하고 export를 수행할 때
  5. parallel DML을 수행할 때
  6. 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 방식으로 데이터를 입력히는 방법

  1. insert ... select 문장에 /*+ append * / 힌트 사용
  2. 병렬 모드로 insert
  3. direct 옵션을 지정하고 SQL*Loader(sqlldr)로 데이터를 로드
  4. 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 비용이 더 든다)