Oracle

게시글 보기
작성자 유건데이타 등록일 2015-07-15
제목 INDEX가 걸려 있는 TABLE에서 TABLE에만 INSERT하는 방법(INDEX DISABLE)
INDEX가 걸려 있는 TABLE에서 TABLE에만 INSERT하는 방법(INDEX DISABLE)
====================================================================


Purpose
-------
Oracle8에서는 Index가 걸려있는 table에 insert는 disable시키고
table에만 먼저 Insert할 수가 있다. 그 방법을 알아보자.


Explanation
-----------

대량의 DATA를 한꺼번에 INSERT하는 경우에는 TABLE에 걸려있는
INDEX 때문에 속도가 느려지게 된다. INDEX를 DROP하고 INSERT한
후에 다시 생성할 수도 있지만 그 경우에도 데이터가 많으므로
INDEX를 다시 생성하는 데에 시간이 오래 걸리게 된다.

Oracle8에서는 이런 경우 index를 고려하지 않고 insert를 한 후에
index를 rebuild하는 방법을 사용할 수 있다. 대량의 data를 입력할
때에 index에는 입력하지 않으므로 보다 속도가 빠르며 index를
rebuild하는 것은 drop한 후에 다시 생성하는 것 보다 속도가 빠르므로
더 효율적인 방법이 될 수 있다.

이 방법은 local index 또는 global index 에 대해 관계없이
사용할 수 있다.


- ON-LINE에서 사용하는 방법

1. 먼저 index의 status를 살펴보면

SQL> select index_name, table_name, status from user_indexes;

INDEX_NAME TABLE_NAME STATUS
---------------- ------------------ --------
I_DEPT DEPT VALID

2. insert를 table의 index인 I_dept 를 unusable 상태로 바꾼다.

SQL> alter index i_dept unusable;
Index altered.

SQL> select index_name, table_name, status from user_indexes;

INDEX_NAME TABLE_NAME STATUS
--------------- ----------------- --------
I_DEPT DEPT UNUSABLE

3. index 가 unusable 인 상태에서는 insert할 수 없으며 다음과
같은 명령어를 실행하여야 insert가 가능하다

SQL> alter session set skip_unusable_indexes = true;
Session altered.

SQL> insert into dept values(50,'aaa','aaa');
1 row created.

4. insert를 하는 작업이 모두 끝나면 다음과 같이 index를 rebuild해 준다.

SQL> alter index i_dept rebuild;
Index altered.

SQL> select index_name, table_name, status from user_indexes;

INDEX_NAME TABLE_NAME STATUS
---------------- ----------------- --------
I_DEPT DEPT VALID


- SQL*LOADER에서 사용하는 방법

SQL*LOADER에서는 다음의 COMMAND OPTION으로 이 방법을 사용할 수 있다.

SKIP_UNUSABLE_INDEXES = TRUE ( DEFAULT 는 FALSE )

loader에서 작업하기 전에 먼저 해당 index를 unusable 상태로
바꾼 후에 다음과 같이 sql*loader를 실행한다.

# sqlldr userid=scott/tiger control=dept.ctl skip_unusable_indexes=true
Comment
등록된 코멘트가 없습니다.