목차

DIRECT PATH LOAD

들어가며

  1. 매우 많은 양의 데이타를 빠른 시간 내에 load하고자하는 경우 direct path load를 사용할 수 있다.
    여기에서 이러한 direct path load의 자세한 개념 및 사용방법, 사용 시 고려해야 할 점 등을 설명한다.

conventional path load

일반적인 INSERT

conventional path load를 사용하는 경우

  1. load 중에 table을 index를 이용하여 access하여야 하는 경우
    direct load중에는 index가 direct load state가 되어 사용이 불가능하다.
  2. load 중에 index를 사용하지 않고 table을 update나 insert등을 수행해야 하는 경우
    direct load 중에는 table에 exclusive write(X) lock을 건다.
  3. SQL*NET을 통해 load를 수행해야 하는 경우
  4. clustered table에 load하여야 하는 경우
  5. index가 걸려 있는 큰 table에 적은 수의 데이타를 load하고자 할 때
  6. referential이나 check integrity가 정의되어 있는 큰 table에 load하고자 할 때
  7. data field에 SQL function을 사용하여 load하고자 할 때

direct path load의 수행 원리

수행원리

  1. SQL INSERT 문장을 generate하여 수행하지 않는다.
  2. memory 내의 bind array buffer를 이용하지 않고
    database block의 format과 같은 data block을 memory에 만들어 데이타를 넣은 후 그대로 disk에 write한다.
    memory 내의 block buffer와 disk의 block은 그 format이 다르다.
  3. load 시작 시에 table에 lock을 걸고 load가 끝나면 release시킨다.
  4. table의 HWM (High Water Mark) 윗 부분의 block에 data를 load한다.
    HWM는 table에 data가 insert됨에 따라 계속 늘어나고 truncate 외에는 줄어들게 하지 못한다.
    그러므로, 항상 완전히 빈 새로운 block을 할당받아 data를 입력시키게 된다.
  5. instance failure가 발생하여도 redo log file을 필요로 하지 않는다.
  6. UNDO information을 발생시키지 않는다.
    즉 rollback segment를 사용하지 않는다.
  7. OS에서 asynchronous I/O가 가능하다면, 복수개의 buffer에 의해서 동시에 data를 읽어서
    buffer에 write하면서 buffer에서 disk로 write할 수 있다.
  8. parallel option을 이용하면 더욱 성능을 향상시킬 수 있다.

direct path load의 사용방법 및 options

  1. direct path load를 사용하기 위한 view들은 다음 script에 포함어 있으며,
    미리 sys user로 수행되어야 한다. 단 이 script는 catalog.sql에 포함되어 있어,
    db 구성 시에 이미 수행되어진다.
     @$ORACLE_HOME/rdbms/admin/catldr.sql 
  2. direct path load를 사용하기 위해서는 일반적인 sqlload 명령문에 DIRECT=TRUE를 포함시키기만 하면 된다.
    다음과 같이 기술하면 된다.
    sqlload username/password control=loadtest.ctl direct=true
  3. 이 direct path load를 사용 시에 고려할 만한 추가적인 option 및 control file 내에 기술 가능한 clause들을 살펴본다.

ROWS = n

PIECED clause

READBUFFERS = n (default is 4)

direct path load에서의 index 처리

direct path load에서 인덱스 생성절차

  1. data가 table에 load된다.
  2. load된 data의 key 부분이 temporary segment에 copy되어 sort된다.[나]
  3. 기존에 존재하던 index와 [나]에 의해서 정렬된 key가 merge된다.[다]
  4. [다]에 의해서 새로운 index가 만들어진다.
    기존에 존재하던 index와 temporary segment, 그리고 새로 만들어지는 index가 merge가 완전히 끝날 때까지 모두 존재한다.
  5. old index와 temporary segment는 지워진다.

Temporary Space 공식

SINGLEROW clause

Direct Load State

index가 direct load state로 되는 원인을 구체적으로 살펴보면 다음과 같다.

  1. index가 생성되는 과정에서 space가 부족한 경우
  2. SORTED INDEXES clause가 사용되었으나, 실제 data는 정렬되어 있지 않은 경우
    이러한 경우 data는 모두 load가 되고, index만이 direct load state로 된다.
  3. index 생성 도중 instance failure가 발생한 경우
  4. unique index가 지정되어 있는 컬럼에 중복된 data가 load되는 경우

Pre-sorting (SORTED INDEX)

Recovery

Integrity Constraints & Triggers

  1. direct path load 중 not null, unique, primary key constraint는 enable 상태로 존재한다.
    not null은 insert시에 check되고 unique는 load후 index를 구성하는 시점에 check된다.
  2. 그러나 check constraint와 referential constraint는 load가 시작되면서 disable상태로 된다.
    전체 데이타가 load되고 난 후 이렇게 disable된 constraints를 enable시키려면 control file내에 REENABLE이라는 option을 지정하여야 한다.
    이 reenable option은 각 constraint마다 지정할 수는 없으며 control file에 한번 지정하면 전체 integrity/check constraint에 영향을 미치게 된다.
    만약 reenable되는 과정에서 constraint를 위배하는 data가 발견되면 해당 constraint는 enable되지 못하고 disabled status로 남게 되며,
    이렇게 위배된 data를 확인하기 위해서는 reenable clause에 exceptions option을 다음과 같이 추가하면 된다.
    reenable [exceptions table_name]
  3. 이 때 table_name은 $ORACLE_HOME/rdbms/admin/utlexcpt.sql을 다른 directory로copy하여 table이름을 exceptions가 아닌 다른 이름으로 만들어 수행시키면 된다.
  4. insert trigger도 integrity/check constraint와 같이 direct load가 시작하는 시점에 disable되며, load가 끝나면 자동으로 enable된다.
    단 enable되고 나서도 load에 의해 입력된 data에 대해 trigger가 fire되지는 않는다.

[펌] http://kr.forums.oracle.com/forums/thread.jspa?threadID=470778&tstart=315