"일반 테이블 파티션 테이블 변경"의 두 판 사이의 차이
DB CAFE
(새 문서: == 일반 테이블을 파티션 테이블로 변경 == === 일반 테이블 생성(테스트) === # 테이블 create table cristmas ( no varchar2(5), sdate varchar2(8), name varcha...) |
|||
(같은 사용자의 중간 판 하나는 보이지 않습니다) | |||
3번째 줄: | 3번째 줄: | ||
=== 일반 테이블 생성(테스트) === | === 일반 테이블 생성(테스트) === | ||
# 테이블 | # 테이블 | ||
+ | <source lang=sql> | ||
create table cristmas ( | create table cristmas ( | ||
no varchar2(5), | no varchar2(5), | ||
11번째 줄: | 12번째 줄: | ||
Table created. | Table created. | ||
− | + | </source> | |
# 인덱스 | # 인덱스 | ||
+ | <source lang=sql> | ||
CREATE INDEX cristmas_idx01 ON cristmas (no,sdate) | CREATE INDEX cristmas_idx01 ON cristmas (no,sdate) | ||
TABLESPACE TS_UNIX_DATA_001; | TABLESPACE TS_UNIX_DATA_001; | ||
Index created. | Index created. | ||
− | + | </source> | |
=== 임시로 파티션 테이블 생성(테이블이 운영중임을 경우, 변경시간을 단축) === | === 임시로 파티션 테이블 생성(테이블이 운영중임을 경우, 변경시간을 단축) === | ||
# Range 파티션 임시_테이블 생성 | # Range 파티션 임시_테이블 생성 | ||
+ | <source lang=sql> | ||
SQL> create table cristmas_2008 ( | SQL> create table cristmas_2008 ( | ||
no varchar2(5), | no varchar2(5), | ||
34번째 줄: | 37번째 줄: | ||
); | ); | ||
Table created. | Table created. | ||
− | + | </source> | |
# LOCAL 인덱스 생성 | # LOCAL 인덱스 생성 | ||
+ | <source lang=sql> | ||
SQL> CREATE INDEX cristmas_idx01_2008 ON cristmas_2008 (no,sdate) | SQL> CREATE INDEX cristmas_idx01_2008 ON cristmas_2008 (no,sdate) | ||
LOCAL | LOCAL | ||
44번째 줄: | 48번째 줄: | ||
); | ); | ||
Index created. | Index created. | ||
− | + | </source> | |
# 파티션 생성 확인 | # 파티션 생성 확인 | ||
− | + | <source lang=sql> | |
− | SQL> SELECT * FROM ALL_PART_INDEXES | + | SQL> SELECT * FROM ALL_PART_INDEXES |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
SQL> SELECT * FROM ALL_PART_TABLES | SQL> SELECT * FROM ALL_PART_TABLES | ||
− | + | </source> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
# 파티션을 만드려는 일반 테이블의 데이터를 임시 테이블에 넣어주면 조건에 맞는 파티션 테이블로 데이터가 자동으로 삽입 | # 파티션을 만드려는 일반 테이블의 데이터를 임시 테이블에 넣어주면 조건에 맞는 파티션 테이블로 데이터가 자동으로 삽입 | ||
+ | <source lang=sql> | ||
SQL> INSERT INTO cristmas_2008 SELECT * FROM cristmas; | SQL> INSERT INTO cristmas_2008 SELECT * FROM cristmas; | ||
92 rows created. | 92 rows created. | ||
+ | </source> | ||
# 파티션에 잘 나뉘어 들어갔는지 확인 | # 파티션에 잘 나뉘어 들어갔는지 확인 | ||
− | + | <source lang=sql> | |
SQL> select * from cristmas_2008 partition(cristmas_200809_PA); | SQL> select * from cristmas_2008 partition(cristmas_200809_PA); | ||
31 rows selected. | 31 rows selected. | ||
− | + | </source> | |
− | |||
# 이제 실 운영중인 일반 테이블과 임시로 만들었던 파티션 테이블을 rename으로 바꿔치기 | # 이제 실 운영중인 일반 테이블과 임시로 만들었던 파티션 테이블을 rename으로 바꿔치기 | ||
# 테이블을 임시로 backup. | # 테이블을 임시로 backup. | ||
− | + | <source lang=sql> | |
SQL> ALTER TABLE cristmas RENAME TO cristmas_bk; | SQL> ALTER TABLE cristmas RENAME TO cristmas_bk; | ||
Table altered. | Table altered. | ||
86번째 줄: | 73번째 줄: | ||
SQL> ALTER INDEX cristmas_idx01 RENAME TO cristmas_idx01_bk; | SQL> ALTER INDEX cristmas_idx01 RENAME TO cristmas_idx01_bk; | ||
Index altered. | Index altered. | ||
− | + | </source> | |
# 임시로 만들었던 파티션 테이블을 실 운영 테이블 이름으로 rename | # 임시로 만들었던 파티션 테이블을 실 운영 테이블 이름으로 rename | ||
+ | <source lang=sql> | ||
SQL> ALTER TABLE cristmas_2008 RENAME TO cristmas; | SQL> ALTER TABLE cristmas_2008 RENAME TO cristmas; | ||
Table altered. | Table altered. | ||
SQL> ALTER INDEX cristmas_idx01_2008 RENAME TO cristmas_idx01; | SQL> ALTER INDEX cristmas_idx01_2008 RENAME TO cristmas_idx01; | ||
Index altered. | Index altered. | ||
− | + | </source> | |
# 파티션 확인 | # 파티션 확인 | ||
# 인덱스 확인 | # 인덱스 확인 | ||
# 각 파티션별 데이터 확인 | # 각 파티션별 데이터 확인 | ||
+ | <source lang=sql> | ||
SQL> select * from cristmas partition(cristmas_200808_PA); | SQL> select * from cristmas partition(cristmas_200808_PA); | ||
SQL> select * from cristmas partition(cristmas_200809_PA); | SQL> select * from cristmas partition(cristmas_200809_PA); | ||
SQL> select * from cristmas partition(cristmas_200810_PA); | SQL> select * from cristmas partition(cristmas_200810_PA); | ||
− | + | </source> | |
# 2008년 11월 데이터를 넣어보자. | # 2008년 11월 데이터를 넣어보자. | ||
분할 조건 값에 정의되지 않는 값이 입력되면 에러 발생!! | 분할 조건 값에 정의되지 않는 값이 입력되면 에러 발생!! | ||
− | + | <source lang=sql> | |
SQL> INSERT INTO cristmas VALUES('93','20081101','go'); | SQL> INSERT INTO cristmas VALUES('93','20081101','go'); | ||
INSERT INTO cristmas VALUES('93','20081101','go') | INSERT INTO cristmas VALUES('93','20081101','go') | ||
109번째 줄: | 98번째 줄: | ||
ERROR at line 1: | ERROR at line 1: | ||
ORA-14400: inserted partition key does not map to any partition | ORA-14400: inserted partition key does not map to any partition | ||
− | + | </source> | |
조건에 맞는 파티션을 ADD해준다. | 조건에 맞는 파티션을 ADD해준다. | ||
(* 위에서 참조한 포스팅에서 언급했듯이 MAX 파티션이 있을 경우는 add는 안되고 split만 됨을 명심하자.) | (* 위에서 참조한 포스팅에서 언급했듯이 MAX 파티션이 있을 경우는 add는 안되고 split만 됨을 명심하자.) | ||
− | + | <source lang=sql> | |
SQL> ALTER TABLE cristmas ADD PARTITION cristmas_200811_pa VALUES LESS THAN (20081132); | SQL> ALTER TABLE cristmas ADD PARTITION cristmas_200811_pa VALUES LESS THAN (20081132); | ||
− | |||
− | |||
− | |||
Table altered. | Table altered. | ||
− | + | </source> | |
# 200811 파티션이 생성되었다. | # 200811 파티션이 생성되었다. | ||
# 파티션 테이블 확인 | # 파티션 테이블 확인 | ||
+ | <source lang=sql> | ||
SQL> | SQL> | ||
− | + | </source> | |
# 200811월 데이터를 넣어보자. | # 200811월 데이터를 넣어보자. | ||
− | + | <source lang=sql> | |
SQL> INSERT INTO cristmas VALUES('93','20081101','go'); | SQL> INSERT INTO cristmas VALUES('93','20081101','go'); | ||
SQL> commit; | SQL> commit; | ||
+ | </source> | ||
# 200811 파티션에 잘 들어가 있음을 확인 | # 200811 파티션에 잘 들어가 있음을 확인 | ||
+ | <source lang=sql> | ||
SQL> select * from cristmas partition(cristmas_200811_PA); | SQL> select * from cristmas partition(cristmas_200811_PA); | ||
+ | </source> | ||
+ | |||
+ | [[category:oracle]] |
2020년 12월 2일 (수) 10:23 기준 최신판
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
1 일반 테이블을 파티션 테이블로 변경[편집]
1.1 일반 테이블 생성(테스트)[편집]
- 테이블
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.
1.2 임시로 파티션 테이블 생성(테이블이 운영중임을 경우, 변경시간을 단축)[편집]
- 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);