posted by 구름너머 2005. 3. 22. 15:01
Direct-Load Insert의 사용방법(Oracle8)

Direct-Load Insert의 사용방법(Oracle8)
======================================

Direct-Load Insert 는 SGA의 buffer cache를 거치지 않고 직접
Oracle data를 구성하고 입력하는 방법이다. 이 기능은 SQL*Loader의
Direct load와 비슷한 기능이다. 이 방법은 undo entry를 생성하지 않으므로
기본 insert보다 속도가 빠르다.
Direct-Load insert는 serial과 parallel mode를 둘 다 사용할 수 있다.


1. Serial, Parallel Insert

Direct-Load Insert는 parititioned와 non-partitioned table에 대해
사용할 수 있으며, 이 명령문 직후에는 반드시 commit이나 rollback이
필요하다.

(1) Serial Direct-Load Insert - data는 해당 segment의 HWM(high
water mark) 다음에 입력되며 commit이 실행되면 hwm이 바뀌면서
data를 볼 수 있게 된다.

(2) Parallel Direct-Load Insert into a nonpartitioned table
- 각 parallel server process는 새로운 temporary segment를
할당하고 데이타를 입력한 후에 commit이 실행되면 parallel
coordinator가 모든 temporary segment를 기존의 segment와 합친다.

(3) Parallel Direct-Load Insert into a partitioned table
- 각 partition마다 하나의 parallel server process를 할당받아서
hwm다음에 data를 입력하고 commmit이 일어나면 hwm이 바뀌게 된다.

2. Direct-Load Insert의 사용방법

Serial Direct-Load Insert는 APPEND hint를 통해 사용할 수 있다.
Parallel Direct-Load Insert는 APPEND 없이 PARALLEL hint만으로도
사용할 수 있다. 즉 Insert 시에 PARALLEL을 지정하면 무조건 Direct-Load로
작동하게 된다.

[예제1] APPEND hint의 사용

SQL> insert /*+ APPEND */ into emp select * from t_emp;
SQL> commit;
(direct insert후에 바로 select를 하기 전에 먼저 commit;을 해야
data를 확인할 수 있다.)

[예제2] PARALLEL hint의 사용

SQL> alter session enable parallel dml;
SQL> insert /*+ PARALLEL(emp,10) */ into emp
select /*+ PARALLEL(t_emp,10) */ * from t_emp;
SQL> commit;

위와 같이 Direct-Load Insert는 대량의 데이타를 한꺼번에 입력하는
경우에 사용하는 것이 좋으므로 일반 insert into .. values 구문에서의
사용은 지양된다.

3. Logging mode의 사용

Direct-Load Insert 방법은 Logging과 no-Logging mode를 둘 다 사용할
수 있다. no-logging mode로 하면 추가된 extent에 대한 정보 등 최소한의
data dictionary의 변경 사항만이 redo log에 적용된다.
그러나, 입력되는 data에 대한 정보는 발생하지 않으므로 속도는 훨씬 빨라진다.
no-logging mode는 table, index, tablespace 등에 지정할 수 있다.

SQL> alter table emp nologging;
SQL> alter session enable parallel dml;
SQL> insert /*+ PARALLEL(emp,10) */ into emp
select /*+ PARALLEL(t_emp,10) */ * from t_emp;
SQL> commit;

4. Space에 대한 고려사항

Direct-Load Insert는 기존의 segment 영역에 있는 입력 가능한 공간을
무시하고 Insert하므로 기존의 Insert보다 더 많은 space가 필요하다.
nonpartitioned table에 parallel insert를 할 경우에는 기존의 extent 영역에
있는 hwm 다음의 free space도 무시하고 새로운 segment를 생성하므로 insert하기
전에 이러한 추가적인 space를 고려해 두어야 한다.
nonparititoned table에 parallel insert 시에는 지정한 parallel server
process의 수만큼 새로운 extent를 생성하는데, 그 크기는 table에 지정한
next + next*pctincrease를 고려하여 만든다. 그러므로 이 작업을 하기 전에는
next와 pctincrease를 적합한 크기로 바꾸어 줄 필요가 있다.

from oracle.com

'ORACLE' 카테고리의 다른 글

Pro*C 에서 COMMIT 에 대하여  (0) 2005.03.23
오라클 Document  (0) 2005.03.23
Pro*C 강좌 파일이 잘되어 있는곳.  (0) 2005.03.22
내장함수 trunc 사용하기...  (0) 2005.03.04
[Oracle] 날자 오류 ORA-01839 피해가기...  (0) 2005.02.01