다른 명령
일반 테이블을 파티션 테이블로 변경
일반 테이블 생성(테스트)
- 테이블
create table cristmas ( no varchar2(5), sdate varchar2(8), name varchar2(15) ) TABLESPACE TS_UNIX_DATA_001; Table created.
- 인덱스
CREATE INDEX cristmas_idx01 ON cristmas (no,sdate) TABLESPACE TS_UNIX_DATA_001; Index created.
임시로 파티션 테이블 생성(테이블이 운영중임을 경우, 변경시간을 단축)
- 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.
- 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.
- 파티션 생성 확인
SQL> SELECT * FROM ALL_PART_INDEXES SQL> SELECT * FROM ALL_PART_TABLES
- 파티션을 만드려는 일반 테이블의 데이터를 임시 테이블에 넣어주면 조건에 맞는 파티션 테이블로 데이터가 자동으로 삽입
SQL> INSERT INTO cristmas_2008 SELECT * FROM cristmas; 92 rows created.
- 파티션에 잘 나뉘어 들어갔는지 확인
SQL> select * from cristmas_2008 partition(cristmas_200809_PA); 31 rows selected.
- 이제 실 운영중인 일반 테이블과 임시로 만들었던 파티션 테이블을 rename으로 바꿔치기
- 테이블을 임시로 backup.
SQL> ALTER TABLE cristmas RENAME TO cristmas_bk; Table altered. SQL> ALTER INDEX cristmas_idx01 RENAME TO cristmas_idx01_bk; Index altered.
- 임시로 만들었던 파티션 테이블을 실 운영 테이블 이름으로 rename
SQL> ALTER TABLE cristmas_2008 RENAME TO cristmas; Table altered. SQL> ALTER INDEX cristmas_idx01_2008 RENAME TO cristmas_idx01; Index altered.
- 파티션 확인
- 인덱스 확인
- 각 파티션별 데이터 확인
SQL> select * from cristmas partition(cristmas_200808_PA); SQL> select * from cristmas partition(cristmas_200809_PA); SQL> select * from cristmas partition(cristmas_200810_PA);
- 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.
- 200811 파티션이 생성되었다.
- 파티션 테이블 확인
SQL>
- 200811월 데이터를 넣어보자.
SQL> INSERT INTO cristmas VALUES('93','20081101','go'); SQL> commit;
- 200811 파티션에 잘 들어가 있음을 확인
SQL> select * from cristmas partition(cristmas_200811_PA);