"파티셔닝테이블"의 두 판 사이의 차이
DB CAFE
(→인덱스 리빌드) |
|||
1번째 줄: | 1번째 줄: | ||
===파티션 테이블 생성=== | ===파티션 테이블 생성=== | ||
− | + | * PARTITION BY RANGE 절에 어떤 column들을 기준으로 하여 Partition을 나눌 것인지 지정을 하고, | |
− | + | * 각 Partition이 나누어 지는 범위는 VALUES LESS THAN 절에서 지정한다. | |
− | + | *: | |
<source lang=sql> | <source lang=sql> | ||
SQL> CREATE TABLE sales | SQL> CREATE TABLE sales | ||
21번째 줄: | 21번째 줄: | ||
===데이터 조작=== | ===데이터 조작=== | ||
− | + | * 아래와 같이 INSERT 문장을 실행 하면 파티션 테이블에서 지정한 범위에 따라서 자동으로 파티션이 지정 됨. | |
− | -- Range 파티션 | + | -- Range 파티션 INSERT 예제 |
<source lang=sql> | <source lang=sql> | ||
INSERT INTO sales VALUES(1, 2004, 06, 12, 'scott', 2500); | INSERT INTO sales VALUES(1, 2004, 06, 12, 'scott', 2500); | ||
61번째 줄: | 61번째 줄: | ||
===파티션 삭제=== | ===파티션 삭제=== | ||
− | + | * Range, List 파티션만 삭제 가능 | |
− | + | * 하나의 파티션은 반드시 남아 있어야 함 | |
− | + | * 한번에 하나의 파티션만 삭제 가능. | |
− | + | *:- 여러 개의 파티션을 삭제하고자 할 때는 삭제 문장을 여러 번 실행 시켜야 함. | |
81번째 줄: | 81번째 줄: | ||
===파티션의 병합(MERGE)=== | ===파티션의 병합(MERGE)=== | ||
− | + | * 파티션 병합은 두 파티션의 데이터를 합치고, 하나의 파티션을 DROP 처리 함. | |
− | + | * Hash Partition, SubPartition은 MERGE 작업을 할 수 없음 | |
-- sales_q1 파티션과 sales_q2 파티션을 sales_q2 파티션으로 병합 | -- sales_q1 파티션과 sales_q2 파티션을 sales_q2 파티션으로 병합 | ||
92번째 줄: | 92번째 줄: | ||
===파티션의 분할(SPLIT)=== | ===파티션의 분할(SPLIT)=== | ||
− | + | * SPLIT 작업은 하나의 파티션을 두 개의 새로운 파티션으로 분할 함 | |
− | + | * Hash Partition, SubPartition은 SPLIT 작업을 할 수 없음. | |
− | + | *:- 아래는 sales 파티션 테이블의 sales_q2 파티션을 (2005,01,01) 값을 기준으로 sales_q1 와 sales_q2로 파티션을 분할하는 예제 | |
<source lang=sql> | <source lang=sql> | ||
113번째 줄: | 113번째 줄: | ||
===파티션의 변경(EXCHANGE)=== | ===파티션의 변경(EXCHANGE)=== | ||
− | + | * 파티션의 EXCHAGEN는 파티션 데이터를 일반테이블로 생성하는 작업 임. | |
− | + | *:- 물론 일반 테이블의 데이터를 파티션 테이블의 데이터로 생성 할 수도 있음. | |
− | + | * 아래 예제는 파티션 테이블의 데이터를 일반 테이블로 생성하는 예제 | |
-- 파티션 데이터를 일반테이블로 이동하기 위한 테이블을 생성 합니다. | -- 파티션 데이터를 일반테이블로 이동하기 위한 테이블을 생성 합니다. |
2024년 3월 25일 (월) 23:01 기준 최신판
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
목차
1 파티션 테이블 생성[편집]
- PARTITION BY RANGE 절에 어떤 column들을 기준으로 하여 Partition을 나눌 것인지 지정을 하고,
- 각 Partition이 나누어 지는 범위는 VALUES LESS THAN 절에서 지정한다.
SQL> CREATE TABLE sales
(sales_no NUMBER,
sale_year INT NOT NULL,
sale_month INT NOT NULL,
sale_day INT NOT NULL,
customer_name VARCHAR2(30),
price NUMBER)
PARTITION BY RANGE (sale_year, sale_month, sale_day)
(
PARTITION sales_q1 VALUES LESS THAN (2005, 01, 01) TABLESPACE ASSM_TBS1,
PARTITION sales_q2 VALUES LESS THAN (2005, 07, 01) TABLESPACE ASSM_TBS2,
PARTITION sales_q3 VALUES LESS THAN (2006, 01, 01) TABLESPACE ASSM_TBS3,
PARTITION sales_q4 VALUES LESS THAN (2006, 07, 01) TABLESPACE ASSM_TBS4
);
2 데이터 조작[편집]
- 아래와 같이 INSERT 문장을 실행 하면 파티션 테이블에서 지정한 범위에 따라서 자동으로 파티션이 지정 됨.
-- Range 파티션 INSERT 예제
INSERT INTO sales VALUES(1, 2004, 06, 12, 'scott', 2500);
INSERT INTO sales VALUES(2, 2005, 06, 17, 'jones', 4300);
INSERT INTO sales VALUES(3, 2005, 12, 12, 'miller', 1200);
INSERT INTO sales VALUES(4, 2006, 06, 22, 'ford', 5200);
INSERT INTO sales VALUES(5, 2005, 01, 01, 'lion', 2200);
INSERT INTO sales VALUES(6, 2006, 12, 22, 'tiger', 3300);
COMMIT;
--> 범위 초과로 ORA-14400 에러 발생 INSERT INTO sales VALUES(6, 2006, 12, 22, 'tiger', 3300); 1행에 오류: ORA-14400: 삽입된 분할 영역 키와 매핑되는 분할 영역이 없음
-- 각 파티션 마다 데이터가 INSERT 되었는지는
-- 직접 SELECT 문으로 확인 해 볼것.
SELECT sales_no FROM sales PARTITION (sales_q1); --> 1
SELECT sales_no FROM sales PARTITION (sales_q2); --> 2, 5
SELECT sales_no FROM sales PARTITION (sales_q3); --> 3
SELECT sales_no FROM sales PARTITION (sales_q4); --> 4
3 파티션 추가[편집]
MAXVALUE partition 이 존재하면 추가가 불가능 합니다.
-- sales 파티션 테이블에 새로운 파티션 sales_q5를 추가하는 예제 입니다.
ALTER TABLE sales
ADD PARTITION sales_q5 VALUES LESS THAN (MAXVALUE, MAXVALUE, MAXVALUE )
TABLESPACE ASSM_TBS5;
4 파티션 삭제[편집]
- Range, List 파티션만 삭제 가능
- 하나의 파티션은 반드시 남아 있어야 함
- 한번에 하나의 파티션만 삭제 가능.
- - 여러 개의 파티션을 삭제하고자 할 때는 삭제 문장을 여러 번 실행 시켜야 함.
-- sales 테이블의 sales_q5 파티션을 삭제
ALTER TABLE sales DROP PARTITION sales_q5;
5 파티션 이름 변경[편집]
- sales 테이블의 sales_q4 파티션 이름을 sales_four로 변경하는 예제.
SQL> ALTER TABLE sales
RENAME PARTITION sales_q4 TO sales_four;
6 파티션의 병합(MERGE)[편집]
- 파티션 병합은 두 파티션의 데이터를 합치고, 하나의 파티션을 DROP 처리 함.
- Hash Partition, SubPartition은 MERGE 작업을 할 수 없음
-- sales_q1 파티션과 sales_q2 파티션을 sales_q2 파티션으로 병합
SQL> ALTER TABLE sales
MERGE PARTITIONS sales_q1, sales_q2 INTO PARTITION sales_q2
UPDATE INDEXES; --> Local Index를 갱신
7 파티션의 분할(SPLIT)[편집]
- SPLIT 작업은 하나의 파티션을 두 개의 새로운 파티션으로 분할 함
- Hash Partition, SubPartition은 SPLIT 작업을 할 수 없음.
- - 아래는 sales 파티션 테이블의 sales_q2 파티션을 (2005,01,01) 값을 기준으로 sales_q1 와 sales_q2로 파티션을 분할하는 예제
ALTER TABLE sales
SPLIT PARTITION sales_q2 AT (2005, 01, 01)
INTO (PARTITION sales_q1 TABLESPACE ASSM_TBS1,
PARTITION sales_q2 TABLESPACE ASSM_TBS2)
- max partition에 add하는 것으로는 불가능
- max partition을 split 해야 함.
ALTER TABLE PART2
SPLIT PARTITION PART2_MAX AT(TO_DATE('20090131','YYYYMMDD'))
INTO (PARTITION PART2_20090131 TABLESPACE TBS01,
PARTITION PART2_MAX TABLESPACE TBS01);
8 파티션의 변경(EXCHANGE)[편집]
- 파티션의 EXCHAGEN는 파티션 데이터를 일반테이블로 생성하는 작업 임.
- - 물론 일반 테이블의 데이터를 파티션 테이블의 데이터로 생성 할 수도 있음.
- 아래 예제는 파티션 테이블의 데이터를 일반 테이블로 생성하는 예제
-- 파티션 데이터를 일반테이블로 이동하기 위한 테이블을 생성 합니다.
CREATE TABLE sales_ex
(sales_no NUMBER,
sale_year INT NOT NULL,
sale_month INT NOT NULL,
sale_day INT NOT NULL,
customer_name VARCHAR2(30),
price NUMBER)
TABLESPACE TS_TBS1;
-- 파티션 데이터를 일반 테이블로 변경 합니다.
ALTER TABLE sales
EXCHANGE PARTITION sales_q1
WITH TABLE sales_ex;
alter table part2
rename partition part2_200902
to part2_200901_new;
-- 파티션 테이블의 데이터를 조회 해봅니다.
SELECT sales_no
FROM sales PARTITION (sales_q1);
선택된 레코드가 없습니다.
-- 파티션 데이터를 이동한 일반 테이블의 데이터를 조회.
SELECT sales_no FROM sales_ex; --> 1
9 파티션의 테이블스페이스 변경[편집]
- sales 테이블의 sales_q3 파티션의 테이블스페이스를 TS_TBS5로 변경하는 예제
ALTER TABLE sales
MOVE PARTITION sales_q3
TABLESPACE TS_TBS5;
10 파티션 데이터 TRUNCATE[편집]
- sales 테이블의 sales_q3 파티션을 TRUNCATE 하는 예제
ALTER TABLE sales TRUNCATE PARTITION sales_q3;
11 파티션 속성 변경[편집]
ALTER TABLE PART2
STORAGE(NEXT 10M);
-> PART2 테이블의 모든 PARTITION의 NEXT 값이 변경된다.
ALTER TABLE PART2
MODIFY PARTITION PART2_200901_NEW
STORAGE(MAXEXTENTS 1000);
12 INDEX 관리[편집]
- MAX를 SPLIT 한 경우 해당 파티션 인덱스를 반드시 REBUILD 해 주어야 한다.
13 파티션 인덱스 상태 확인[편집]
SELECT INDEX_NAME
, PARTITION_NAME
, HIGH_VALUE
, STATUS
, TABLESPACE_NAME
FROM ALL_IND_PARTITIONS;