사용자 도구

사이트 도구


dbms:oracle:concept:directpathload

문서의 이전 판입니다!


DIRECT PATH LOAD

들어가며

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

conventional path load

일반적인 INSERT

  • 일반적인 sql*loader를 이용한 방법은 존재하는 table에 datafile 내의 data를 SQL의 INSERT command를 이용하여 insert시킨다.
    이렇게 SQL command를 이용하기 때문에 각각의 데이타를 위한 insert command가 생성되어 parsing되는 과정이 필요하며,
    먼저 bind array buffer (data block buffer) 내에 insert되는 데이타를 입력시킨 후 이것을 disk에 write하게 된다.

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의 수행 원리

  • Direct Path Loads는 다음과 같은 특징들로 인하여 매우 많은 양의 데이타를 빠른 시간에 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

  • conventional path load에서 rows는 default가 64이며, rows에 지정된 갯수만큼의 row가 load되면 commit이 발생한다.
    이와 비슷하게 direct load path에서는 rows option을 이용하여 data save를 이루며,
    data save가 발생하면 data는 기존 table에 포함되어 입력된 data를 잃지 않게 된다.
  • 단 이 때 direct path load는 모든 data가 load된 다음에야 index가 구성되므로
    data save가 발생하여도 index는 여전히 direct load state로 사용하지 못하게 된다.
  • direct path load에서 이 rows의 default값은 unlimited이며,
    지정된 값이 database block을 채우지 못하면 block을 완전히 채우는 값으로 올림하여,
    partial block이 생성되지 않도록 한다.

PIECED clause

  • control file내에 column_spec datatype_spec PIECED 순으로 기술하는 것으로서 direct path load에만 유효하다.
    LONG type과 같이 하나의 data가 maximum buffer size보다 큰 경우 하나의 data를 여러번에 나누어 load하는 것이다.
    이 option은 table의 맨 마지막 field 하나에만 적용가능하며, index column인 경우에는 사용할 수 없다.
  • 그리고 load도중 data에 문제가 있는 경우 현재 load되는 data의 잘린 부분만 bad file에 기록되게 된다.
    왜냐하면 이전 조각은 이미 datafile에 기록되어 buffer에는 남아있지 않기 때문이다.

READBUFFERS = n (default is 4)

  • 만약 매우 큰 data가 마지막 field가 아니거나 index의 한 부분인 경우 PIECED option을 사용할 수 없다.
    이러한 경우 buffer size를 증가시켜야 하는데 이것은 readbuffers option을 이용하면 된다.
    default buffer갯수는 4개이며, 만약 data load중 ORA-2374(No more slots for read buffer queue) message가 나타나면, buffer갯수가 부족한 것이므로 늘려주도록 한다.
  • 단 일반적으로는 이 option을 이용하여 값을 늘린다하더라도 system overhead만 증가하고 performance의 향상은 기대하기 어렵다.

direct path load에서의 index 처리

  • direct path load를 사용하기 위한 view들은 다음 script에 포함어 있으며, 미리 sys user로 수행되어야 한다.
    단 이 script는 catalog.sql에 포함되어 있어, db 구성 시에 이미 수행되어진다.
     @$ORACLE_HOME/rdbms/admin/catldr.sql 

direct path load를 사용하기 위해서는 일반적인 sqlload 명령문에 DIRECT=TRUE를 포함시키기만 하면 된다. 다음과 같이 기술하면 된다.

sqlload username/password control=loadtest.ctl direct=true

이 direct path load를 사용 시에 고려할 만한 추가적인 option 및 control file 내에 기술 가능한 clause들을 살펴본다.

(1) ROWS = n conventional path load에서 rows는 default가 64이며, rows에 지정된 갯수 만큼의 row가 load되면 commit이 발생한다. 이와 비슷하게 direct load path에서는 rows option을 이용하여 data save를 이루며, data save가 발생하면 data는 기존 table에 포함되어 입력된 data를 잃지 않게 된다. 단 이 때 direct path load는 모든 data가 load된 다음에야 index가 구성되므로 data save가 발생하여도 index는 여전히 direct load state로 사용하지 못하게 된다. direct path load에서 이 rows의 default값은 unlimited이며, 지정된 값이 database block을 채우지 못하면 block을 완전히 채우는 값으로 올림하여, partial block이 생성되지 않도록 한다.

(2) PIECED clause control file내에 column_spec datatype_spec PIECED 순으로 기술하는 것으로서 direct path load에만 유효하다. LONG type과 같이 하나의 data가 maximum buffer size보다 큰 경우 하나의 data를 여러번에 나누어 load하는 것이다. 이 option은 table의 맨 마지막 field 하나에만 적용가능하며, index column인 경우에는 사용할 수 없다. 그리고 load도중 data에 문제가 있는 경우 현재 load되는 data의 잘린 부분만 bad file에 기록되게 된다. 왜냐하면 이전 조각은 이미 datafile에 기록되어 buffer에는 남아있지 않기 때문이다.

(3) READBUFFERS = n (default is 4) 만약 매우 큰 data가 마지막 field가 아니거나 index의 한 부분인 경우 PIECED option을 사용할 수 없다. 이러한 경우 buffer size를 증가시켜야 하는데 이것은 readbuffers option을 이용하면 된다. default buffer갯수는 4개이며, 만약 data load중 ORA-2374(No more slots for read buffer queue) message가 나타나면, buffer갯수가 부족한 것이므로 늘려주도록 한다. 단 일반적으로는 이 option을 이용하여 값을 늘린다하더라도 system overhead만 증가하고 performance의 향상은 기대하기 어렵다.

Recovery

Integrity Constraints & Triggers

dbms/oracle/concept/directpathload.1205819102.txt.gz · 마지막으로 수정됨: 2008/03/18 14:45 저자 starlits