행위

일반 테이블 파티션 테이블 변경

DB CAFE

thumb_up 추천메뉴 바로가기


1 일반 테이블을 파티션 테이블로 변경[편집]

1.1 일반 테이블 생성(테스트)[편집]

  1. 테이블
create table cristmas (
no varchar2(5),
sdate varchar2(8),
name varchar2(15)
)
TABLESPACE TS_UNIX_DATA_001;

Table created.
  1. 인덱스
CREATE INDEX cristmas_idx01 ON cristmas (no,sdate)
TABLESPACE TS_UNIX_DATA_001;

Index created.

1.2 임시로 파티션 테이블 생성(테이블이 운영중임을 경우, 변경시간을 단축)[편집]

  1. Range 파티션 임시_테이블 생성
SQL> create table cristmas_2008 (
no varchar2(5),
sdate varchar2(8),
name varchar2(15)
)
TABLESPACE TS_UNIX_DATA_001
PARTITION BY RANGE (sdate)
(
 PARTITION cristmas_200808_PA VALUES LESS THAN ('20080832') TABLESPACE TS_UNIX_DATA_001,
 PARTITION cristmas_200809_PA VALUES LESS THAN ('20080932') TABLESPACE TS_UNIX_DATA_001,
 PARTITION cristmas_200810_PA VALUES LESS THAN ('20081032') TABLESPACE TS_UNIX_DATA_001
);
Table created.
  1. LOCAL 인덱스 생성
SQL> CREATE INDEX cristmas_idx01_2008 ON cristmas_2008 (no,sdate)
LOCAL
(
 PARTITION cristmas_200808_PA TABLESPACE TS_UNIX_DATA_001,
 PARTITION cristmas_200809_PA TABLESPACE TS_UNIX_DATA_001,
 PARTITION cristmas_200810_PA TABLESPACE TS_UNIX_DATA_001
);
Index created.
  1. 파티션 생성 확인
SQL> SELECT * FROM ALL_PART_INDEXES 
SQL> SELECT * FROM ALL_PART_TABLES
  1. 파티션을 만드려는 일반 테이블의 데이터를 임시 테이블에 넣어주면 조건에 맞는 파티션 테이블로 데이터가 자동으로 삽입
SQL> INSERT INTO cristmas_2008 SELECT * FROM cristmas;
92 rows created.
  1. 파티션에 잘 나뉘어 들어갔는지 확인
SQL> select * from cristmas_2008 partition(cristmas_200809_PA);

31 rows selected.
  1. 이제 실 운영중인 일반 테이블과 임시로 만들었던 파티션 테이블을 rename으로 바꿔치기
  2. 테이블을 임시로 backup.
SQL> ALTER TABLE cristmas RENAME TO cristmas_bk;
Table altered.

SQL> ALTER INDEX cristmas_idx01 RENAME TO cristmas_idx01_bk;
Index altered.
  1. 임시로 만들었던 파티션 테이블을 실 운영 테이블 이름으로 rename
SQL> ALTER TABLE cristmas_2008 RENAME TO cristmas;
Table altered.
SQL> ALTER INDEX cristmas_idx01_2008 RENAME TO cristmas_idx01;
Index altered.
  1. 파티션 확인
  2. 인덱스 확인
  3. 각 파티션별 데이터 확인
SQL> select * from cristmas partition(cristmas_200808_PA);
SQL> select * from cristmas partition(cristmas_200809_PA);
SQL> select * from cristmas partition(cristmas_200810_PA);
  1. 2008년 11월 데이터를 넣어보자.
 분할 조건 값에 정의되지 않는 값이 입력되면 에러 발생!!
SQL> INSERT INTO cristmas VALUES('93','20081101','go');
INSERT INTO cristmas VALUES('93','20081101','go')
            *
ERROR at line 1:
ORA-14400: inserted partition key does not map to any partition

조건에 맞는 파티션을 ADD해준다.

(* 위에서 참조한 포스팅에서 언급했듯이 MAX 파티션이 있을 경우는 add는 안되고 split만 됨을 명심하자.)

SQL> ALTER TABLE cristmas ADD PARTITION cristmas_200811_pa VALUES LESS THAN (20081132);
Table altered.
  1. 200811 파티션이 생성되었다.
  2. 파티션 테이블 확인
SQL>
  1. 200811월 데이터를 넣어보자.
SQL> INSERT INTO cristmas VALUES('93','20081101','go');
SQL> commit;
  1. 200811 파티션에 잘 들어가 있음을 확인
SQL> select * from cristmas partition(cristmas_200811_PA);