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이 걸린다. 즉, 다른 트랜잭션이 수행할 수 없다.

문서에 대하여