IT기술/Oracle

11 SQL Loader 를 활용한 대량 데이터 입력하기

dobbby 2013. 12. 30. 12:12
반응형

Conventional Path : 자주 사용하는 블록을 메모리에 공유해서 디스크 I/O 를 줄이기 위해 도입된 방식

HWM (High Water Mark) 사용

HWM Bump Up 을 하며 대량의 데이터를 입력할 때 성능 저하


Direct Path : 메모리를 거치지 않고 데이터 파일로 바로 데이터를 입력하는 것

처음부터 HWM 오른쪽에 비어있는 블록에 한꺼번에 데이터를 입력하고 commit 하는 방식

단점은 해당 입력 작업시 Exclusive Lock 을 설정하기 때문에 동시 작업이 어렵다.

사용량이 적은 시간에 작업해야 한다.


SQL Loader : 다른 응용 프로그램에 저장되어 있던 대량의 데이터를 오라클로 이전할 때 유용하게 사용할 수 있는 유틸리티

환경 변수 체크

NLS_LANG

ORACLE_HOME

LD_LIBRARY_PATH (Unix만) 

ORA_NLS33 이나 ORA_NLS10


control file : 오라클을 운영하기 위해 사용하는 파일이 아니라 SQL Loader 를 사용하기 위한 정보를 가진 파일


SQL Loader 실행하기

$ sqlldr


실습1 입력데이터가 외부 프로그램 자료일 경우

파일을 WinSCP 같은 프로그램으로 옮긴 후


데이터 행만 남기고 삭제

$ vi dept2.csv


테이블 생성 

SQL> create table dept2

  2    as select *

  3    from dept

  4    where 1=2 ;


SQL Loader 의 control file 생성

$ vi dept2.ctl

load data

infile "/home/oracle/dept.ctl"

into table dept2

fields terminated by ','

(deptno,dname,loc)


control file 저장하고 실행

$ sqlldr scott/tiger control='/home/oracle/dept2.ctl'


결과 확인

SQL> select * from dept2 ;



실습2 입력데이터가 control file 내부에 있을 경우


$ vi dept2_02.ctl

load data

infile *              입력 데이터가 control file 내부에 있을 경우 사용

replace             replace 대체, append 는 추가

into table dept20

fields terminated by ',' optionally enclosed by '"'    한글이 "" 으로 묶여있으므로 "은 입력안됨

(deptno,dname,loc)

begin data

11, "서울", "강남"

22, "대전", "유성"

33, "제주", "서귀포"

44, "서울", "본사"


테이블 생성

SYS> create table scott.dept20

  2    (deptno number,

  3    dname varchar2(10),

  4    loc varchar2(10)) ;


실행

$ sqlldr scott/tiger control='/home/oracle/dept2_02.ctl'


결과 확인

SQL> select * from dept20 ;



실습3 각종 파일 사용하기 (Bad File, Discard File)

데이터형이나 사이즈가 맞지 않을 경우 입력되지 못한 데이터는 Bad File 에 남아있으며, 경로는 log 파일을 보면 알 수 있다.

$ vi dept2_02.log

...

Bad File:    /home/oracle/detp2_02.bad

...



실습4 control file 에서 position 사용하기

엑셀에서 공백으로 구분한 prn 파일을 생성 후 옮긴다.


control file 생성

$ vi test3.ctl

load data

infile '/home/oracle/test3.prn'

into table test3

trailing nullcols

(empno position(01:04) integer external,

name position(6:11) char,

position position(13:16) char,

sal position(18:21) integer external,

comm position(23:25) integer external,

deptno position(27:28) integer external)


테이블 생성

SQL> create table scott.test3

...


실행

$ sqlldr scott/tiger control='test3.ctl'


결과 확인

SQL> select * from test3;



실습5 null 값을 0으로 표시

Null 이 포함된 파일 생성 후 옮긴다.


control file 생성

$ vi test4.ctl

load data

infile '/home/oracle/test4.csv'

replace

into table test4

fields terminated by ','

(번호 char,

이름 char,

급여 integer external,

상여금 integer external "nvl(:상여금,0)")


테이블 생성

SQL> create table scott.test4

...


실행

sqlldr scott/tiger control='test4.ctl'


결과 확인

SQL> select * from test4;


반응형