- Range Partition은 Column 값 의 범위를 기준으로 하여 행을 분할하는 형태로, 달, 분기 등의 logical 한 범위의 분산에 주로 사용 합니다.
즉, 정해진 범위에 따라 비슷한 크기로 partition 이 예상되는 곳에 효율적입니다.
- Range Partition을 생성할 때 어느 행을 기준으로 어느 만큼의 값의 범위로 분할 할지를 다음 두 절에서 정의하게 됩니다.
기본 Table에서 어느 Column을 기준으로 분할할지를 정합니다.
각 Partition이 어떤 값의 범위를 포함 할지 MAX Value값을 정합니다.
- PARTITION BY RANGE 절에서 지정 할 수 있는 Column은 한 개의 Column만으로 구성할 할 수도 있고 결합인덱스처럼 여러 개의 Column이 지정될 수 도 있습니다.
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 );
아래와 같이 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
MAXVALUE partition 이 존재하면 추가가 불가능 합니다.
-- sales 파티션 테이블에 새로운 파티션 sales_q5를 추가하는 예제 입니다. SQL> ALTER TABLE sales ADD PARTITION sales_q5 VALUES LESS THAN (MAXVALUE, MAXVALUE, MAXVALUE ) TABLESPACE ASSM_TBS5;
Range, List 파티션만 가능 합니다.
하나의 파티션은 반드시 남아 있어야 합니다.
한번의 하나의 파티션만 삭제 가능 합니다. 여러 개의 파티션을 삭제하고자 할 때는 삭제 문장을 여러 번 실행 시켜야 합니다.
-- sales 테이블의 sales_q5 파티션을 삭제 SQL> ALTER TABLE sales DROP PARTITION sales_q5;
sales 테이블의 sales_q4 파티션 이름을 sales_four로 변경하는 예제 입니다.
SQL> ALTER TABLE sales RENAME PARTITION sales_q4 TO sales_four;
파티션 병합은 두 파티션의 데이터를 합치고, 하나의 파티션을 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를 갱신
SPLIT 작업은 하나의 파티션을 두 개의 새로운 파티션으로 분할 합니다.
Hash Partition, Subpartition은 SPLIT 작업을 할 수 없습니다
아래는 sales 파티션 테이블의 sales_q2 파티션을 (2005,01,01) 값을 기준으로 sales_q1 와 sales_q2로 파티션을 분할하는 예제 입니다.
SQL> ALTER TABLE sales SPLIT PARTITION sales_q2 AT (2005, 01, 01) INTO (PARTITION sales_q1 TABLESPACE ASSM_TBS1, PARTITION sales_q2 TABLESPACE ASSM_TBS2)
파티션의 EXCHAGEN는 파티션 데이터를 일반테이블로 생성하는 작업입니다. 물론 일반 테이블의 데이터를 파티션 테이블의 데이터로 생성 할 수도 있습니다.
아래 예제는 파티션 테이블의 데이터를 일반 테이블로 생성하는 예제 입니다.
-- 파티션 데이터를 일반테이블로 이동하기 위한 테이블을 생성 합니다. SQL> 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 ASSM_TBS1; -- 파티션 데이터를 일반 테이블로 변경 합니다. SQL> ALTER TABLE sales EXCHANGE PARTITION sales_q1 WITH TABLE sales_ex; -- 파티션 테이블의 데이터를 조회 해봅니다. SQL> SELECT sales_no FROM sales PARTITION (sales_q1); 선택된 레코드가 없습니다. -- 파티션 데이터를 이동한 일반 테이블의 데이터를 조회 해봅니다. SQL> SELECT sales_no FROM sales_ex; --> 1
sales 테이블의 sales_q3 파티션의 테이블스페이스를 ASSM_TBS5로 변경하는 예제 입니다.
SQL> ALTER TABLE sales MOVE PARTITION sales_q3 TABLESPACE ASSM_TBS5;
sales 테이블의 sales_q3 파티션을 TRUNCATE 하는 예제 입니다.
SQL> ALTER TABLE sales TRUNCATE PARTITION sales_q3;
- 강좌 URL : http://www.gurubee.net/lecture/1908
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.