Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-14
제목 EXPORT/IMPORT 를 이용하여 TABLE과 INDEX를 분리하는 방법
EXPORT/IMPORT 를 이용하여 TABLE과 INDEX를 분리하는 방법
======================================================

테이블과 인덱스의 테이블스페이스를 분리하려고 하는 경우
PRIMARY KEY와 같이 CREATE INDEX로 생성된 것이 아니라, CREATE TABLE,
ALTER TABLE 등으로 생성된 CONSTRAINT는 IMPORT 시에 INDEXFILE 옵션을
주어서 분리할 수가 없다. 따라서 PRIMARY KEY, UNIQUE KEY 등의
CONSTRAINT 를 테이블과 분리하고자 하는 경우 IMPORT에서 제공하는
OPTION으로는 처리할 수가 없다.

이 문제는 다음과 같이 해결할 수 있다.

1. 우선 다음과 같이 해서 INDEX 생성 스크립트를 받는다.

imp userid/password file=expdat.dmp indexfile=indexes.sql


2. 위에서 생긴 indexes.sql을 열어보면 table을 생성하는 스크립트가
#으로 막힌 채 들어있는데 #을 푼 다음에 이 스크립트를 실행해서 테이블
을 만들어 줍니다. 단, index를 만드는 명령도 들어있으면 거기에서 원하
는 테이블 스페이스로 이름을 바꿔 준다음에 작업을 해야 한다.


3. 이제 primary key 등의 constraint를 생성하는 스크립트를 다음과
같이 해서 만든다.

strings expdat.dmp | grep "ALTER TABLE" > constraint.sql

이제 constraint.sql을 열어보면 ALTER TABLE 명령이 들어있는데, 여기서
PRIMARY KEY 등이 생성된다. 이 스크립트를 편집해서 돌려주면 primary key
등도 원하는 테이블스페이스에 생성할 수 있다.
--------------------------------------------------------------------
결국 primary key나 unique constraint에 의해 생성된 index는 다시 만들 수
밖에 없는데 이 다시 만드는 방법이 drop후 다시 create하는 것 외에
rebuild라는 것이 가능합니다.
index를 만드는 데는 sorting이 많은 시간을 차지하는데 rebuild를 사용하면
space는 다른 곳으로 옮기더라도 기존의 sorting된 data를 이용하기 때문에
sort하는데 걸리는 시간을 단축할 수가 있게 되는 것입니다.

rebuild하는 방법은 다음과 같습니다.

(1) index를 다른 tablespace로 옮기신 후에도 여전히 table과 같은
tablespace에 남아 있는 index를 찾습니다.
예를 들어 table은 users, index는 idxtbs에 들어간다고 가정하고

select index_name from user_indexes
where tablespace_name = 'USERS';

(2) 위에서 나온 각각의 index (예를 들어 dept_pk) 에 대해서 다음과
같이 작업하십시오.

alter index dept_pk rebuild tablespace idxtbs storage(initial 30m next 5m pctincrease 0);

여기에서 storage 안의 절은 원하시는 크기를 사용하시면 됩니다.
지정하지 않으시면 기존의 storage가 그대로 적용되므로 storage는
변경하고 싶지 않으시면 storage절을 빼시기 바랍니다.
Comment
등록된 코멘트가 없습니다.