# 데이터베이스/오라클

[ORACLE] Direct Path Insert

dev-jjong 2023. 7. 27. 09:06

일반적인 Insert가 느린 이유는

  1. 데이터를 입력할 수 있는 블록을 Freelist에서 찾는다.
    (Freelist란? HWM 아래쪽에 있는 블록중 입력이 가능한 블록에 대한 목록)
    (HWM란? High-Water-Mart. 즉, 테이블 데이터가 쌓여있는 가장 높은 영역)
  2. Freelist에서 할당받은 블록을 버퍼캐시에서 찾는다.
  3. 버퍼캐시에 없으면, 데이터파일에서 읽어 버퍼캐시에 적재한다.
  4. INSERT 내용을 Undo 세그먼트에 기록한다.
    (Undo란? 트랜젝션을 롤백하기 위해 기록한 정보)
  5. INSERT 내용을 Redo 로그에 기록한다.
    (Redo란? 트랜젝션을 리커버리 하기위한 정보)

Direct Path Insert 방식이 빠른 이유는

  1. Freelist를 참조하지 않고 HWM 바깥 영역에 데이터를 순차적으로 입력한다.
  2. 블록을 버퍼캐에서 탐색하지 않는다.
  3. 버퍼캐시에 적재하지 않고, 데이터파일에 직접 기록한다.
  4. Undo 로깅을 안 한다.
    (HWM 뒤쪽에 데이터를 순차적으로 입력하기 때문이다. 이 데이터는 커밋하기 전까지 다른 세션이 읽지 않으므로 Redo Consistency를 위해 Undo 데이터를 남기지 않아도 된다.)
  5. Redo 로깅을 안하게 할 수 있다.
    (alter table t NOLOGGING;)

Direct Path Insert가 가능한 케이스

  1. INSERT ··· SELECT문에 append 힌트 사용
  2. parallel 힌트를 이용해 병렬 모드로 INSERT
  3. direct 옵션을 지정하고 SQL*Loader(sqlldr)로 데이터 적재 (무슨말일까..)
  4. CTAS(create table ··· as select) 문 수행

Direct Path Insert시 주의할 점

  1. 성능은 빨라지지만 Exclusive 모드 TM Lock이 걸린다. 즉, 커밋하기 전까지 다른 트랜잭션은 해당 테이블에 DML을 수행하지 못한다.
  2. Freelist를 조회하지 않고 HWM 바깥 영역에 입력하므로 테이블에 여유 공간이 있어도 재활용하지 않는다.