행위

"일반 테이블 파티션 테이블 변경"의 두 판 사이의 차이

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  
SEGMENT NAME : cristmas_2008
 
 
 
OWNER      SEGMENT_NAME              PARTITION_NAME              SEGMENT_TYPE      TABLESPACE_NAME      bytes(mb)
 
---------- ------------------------- --------------------------  -------------------- ----------------------- ----------
 
HAPPY      CRISTMAS_2008                CRISTMAS_200808_PA        TABLE PARTITION      TS_UNIX_DATA_001                  1
 
HAPPY      CRISTMAS_2008                CRISTMAS_200809_PA        TABLE PARTITION      TS_UNIX_DATA_001                  1
 
HAPPY      CRISTMAS_2008                CRISTMAS_200810_PA        TABLE PARTITION      TS_UNIX_DATA_001                  1
 
 
 
 
 
 
 
SQL> SELECT * FROM ALL_PART_TABLES
 
SQL> SELECT * FROM ALL_PART_TABLES
SEGMENT NAME : cristmas_idx01_2008
+
</source>
 
 
OWNER      SEGMENT_NAME              PARTITION_NAME              SEGMENT_TYPE      TABLESPACE_NAME      bytes(mb)
 
---------- ------------------------- --------------------------  -------------------- ----------------------- ----------
 
HAPPY      CRISTMAS_IDX01_2008        CRISTMAS_200808_PA        INDEX PARTITION      TS_UNIX_DATA_001                  1
 
HAPPY      CRISTMAS_IDX01_2008        CRISTMAS_200808_PA        INDEX PARTITION      TS_UNIX_DATA_001                  1
 
HAPPY      CRISTMAS_IDX01_2008        CRISTMAS_200808_PA        INDEX PARTITION      TS_UNIX_DATA_001                  1
 
 
 
 
 
# 파티션을 만드려는 일반 테이블의 데이터를 임시 테이블에 넣어주면 조건에 맞는 파티션 테이블로 데이터가 자동으로 삽입
 
# 파티션을 만드려는 일반 테이블의 데이터를 임시 테이블에 넣어주면 조건에 맞는 파티션 테이블로 데이터가 자동으로 삽입
 +
<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>

2020년 12월 1일 (화) 13:21 판

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);