SQL*LOADER는 일반 text file의 data를 ORACLE table로 load하는 유틸리티로서 IBM의 DB2 load utility와 흡사하다. SQL*LOADER의 처리 mode에는 크게 direct load와 conventional load가 있다. 여기에서는 각 mode 의 차이점과, SQL*LOADER 를 실행중 index 가 direct load state로 빠지는 현상에 대해 살펴본다.
1.CONVENTIONAL PATH LOAD
default로 사용되는 option으로 일정한 크기의 버퍼을 memory에 할당하고 이곳에 text data를 저장 하여 버퍼가 모두 차면 SQL command인 insert를 이용하여일반 적인 insert 작업을 수행하게 된다. 이러한 방법은 ORACLE에서 제공하는 일반적인 다른 tool 들에서도 사용하는 insert 방법이다. commit은 버퍼에 저장된 row들이 전부 insert되었을때 수행되며 버퍼의 size는 bindsize라는 option으로 지정되며 만일 한 row의 길이가 너무 길어 지정된 bindsize내에 하나의 row가 수용되지 못할 정도로 크다면 SQL*LOADER는 error를 발생시킨다.
예)bindsize=10k,rows=1,record length=15K일 경우 error발생.
conventional mode는 direct mode에 비해 처리 과정에서 훨씬 여러 단계를 거치므로 performance는 떨어진다. 그러나 이 방법은direct mode가 안고 있는 몇 가지 제한 사항을 해결하는 장점이 있다.
1)load하려는 table에 다른 process에서 access가 가능하다.
즉 한쪽에서는 SQL*LOADER로 A table에 load하고 다른 쪽에서는 같은 A table에 SQL*PLUS로 update,insert가 가능하다.
2)load시 SQL function을 사용 하려면 conventional을 사용해야 한다.
예)load data
infile 'test.dat'
append
into table dept
(deptno position(01:02) integer external,
dname position(03:10) char upper(:dname),
loac position(11:15) char
)
3)load하려고 하는 table이 단일 table이 아닌 cluster인 경우로 cluster table은 direct path load를 사용 못함.
4)SQL*NET을 통해 data를 load시 SQL*NET을 이용해 direct path load mode로 data를 load할 수는 없다.
2.DIRECT PATH LOAD
direct mode는 일반적으로 다량의 data를 table에 load시 performance를 위해 이용하는 방법이다. 이 경우에는 일반적으로 table에 index가 있으면 제거한 후 load를 하는 것이 더 좋은 performance를 얻을 수 있는데 그 이유는 direct mode에서insert시 index가 구성되는 mechanism을 살펴보면 쉽게 알 수 있다.
1)direct path load에서의 index의 형성과정은
memory buffer의 data를 datafile에 direct하게 저장
load된 new data에 대해 temporary index를 생성
old index와 temporary index를 merge하여 new index를 형성
d)old index의 drop및 new index로 대치한다.
2)이의 처리를 위해 direct path를 이용해 data load시 다음의 제한이 따른다.
a)cluster에는 사용 할 수 없다.
만일 해당 table에 active transaction이 있는 경우 error발생(commit 안된transaction 이 있는 상태에서 direct load시 ORA-54 error가 발생하는데 해당 table에 table lock을 걸다 실패하기 때문이다)
c)SQL function을 control file에서 사용 할 수 없다.
d)만일 index가 table에 있을 경우 direct load중에는 select를 할 수 없다.
제약사항과 특별한 index 생성 process로 인해 direct mode에서는 실제로 data는 table에 load 되었으나 index에서 문제가 발생하여 해당index를 사용하지 못하는 상태가 발생할 수 있다. 즉 direct load중 index에 대한 space를 allocate할 수 없는 경우, sorted indexes option이 사용되었는데 data가 ordered되지 않은 경우, load도중 shutdown이 발생한 경우, index가 unique index인데 load되는 data중에 동일한 key값이 있는 경우에 해당index는 direct load state 상태가 된다. 이 상태에서는 이 테이블을 select시 index를 사용하지 못하거나, SQL*LOADER direct=y option으로 load시 ORA-1502 error 를 만나게 된다. 이 때는 해당 index를 drop후 recreate하면 쉽게 해결이 가능하다
'Oracle > oracle' 카테고리의 다른 글
NOT IN, NOT EXISTS, MINUS의 효과적인 튜닝방법 (0) | 2010.04.01 |
---|---|
[SQL튜닝]EXISTS 와 DISTINCT / Execution Plan (0) | 2010.04.01 |
DIRECT PATH LOAD의 개념 및 사용 방법 (0) | 2010.01.20 |
오라클 클라이언트 / 서버 상호 운용성 지원 (0) | 2010.01.08 |
오라클 리스너 포트 변경 (0) | 2010.01.05 |