행위

"파티셔닝테이블"의 두 판 사이의 차이

DB CAFE

(파티션의 변경(EXCHANGE))
19번째 줄: 19번째 줄:
  
 
===데이터 조작===
 
===데이터 조작===
 +
 
   아래와 같이 INSERT 문장을 실행 하면 파티션 테이블에서 지정한 범위에 따라서 자동으로 파티션이 지정 됩니다.
 
   아래와 같이 INSERT 문장을 실행 하면 파티션 테이블에서 지정한 범위에 따라서 자동으로 파티션이 지정 됩니다.
  
121번째 줄: 122번째 줄:
 
-- 파티션 데이터를 일반테이블로 이동하기 위한 테이블을 생성 합니다.
 
-- 파티션 데이터를 일반테이블로 이동하기 위한 테이블을 생성 합니다.
 
<source lang=sql>
 
<source lang=sql>
SQL> CREATE TABLE sales_ex
+
  CREATE TABLE sales_ex
 
       (sales_no NUMBER,
 
       (sales_no NUMBER,
 
         sale_year INT NOT NULL,
 
         sale_year INT NOT NULL,
132번째 줄: 133번째 줄:
 
-- 파티션 데이터를 일반 테이블로 변경 합니다.
 
-- 파티션 데이터를 일반 테이블로 변경 합니다.
 
<source lang=sql>
 
<source lang=sql>
SQL> ALTER TABLE sales
+
  ALTER TABLE sales
    EXCHANGE PARTITION sales_q1  
+
EXCHANGE PARTITION sales_q1  
    WITH TABLE sales_ex;
+
    WITH TABLE sales_ex;
 
</source>
 
</source>
  
146번째 줄: 147번째 줄:
 
-- 파티션 테이블의 데이터를 조회 해봅니다.
 
-- 파티션 테이블의 데이터를 조회 해봅니다.
 
<source lang=sql>
 
<source lang=sql>
SQL> SELECT sales_no  
+
SELECT sales_no  
    FROM sales PARTITION (sales_q1);  
+
  FROM sales PARTITION (sales_q1);  
 
</source>
 
</source>
 
선택된 레코드가 없습니다.
 
선택된 레코드가 없습니다.
154번째 줄: 155번째 줄:
 
-- 파티션 데이터를 이동한 일반 테이블의 데이터를 조회 해봅니다.
 
-- 파티션 데이터를 이동한 일반 테이블의 데이터를 조회 해봅니다.
 
<source lang=sql>
 
<source lang=sql>
SQL> SELECT sales_no FROM sales_ex;  --> 1
+
SELECT sales_no FROM sales_ex;  --> 1
 
</source>
 
</source>
  
161번째 줄: 162번째 줄:
  
 
<source lang=sql>
 
<source lang=sql>
SQL> ALTER TABLE sales  
+
ALTER TABLE sales  
    MOVE PARTITION sales_q3  
+
MOVE PARTITION sales_q3  
    TABLESPACE ASSM_TBS5;
+
TABLESPACE ASSM_TBS5;
 
</source>     
 
</source>     
 
   
 
   
171번째 줄: 172번째 줄:
  
 
<source lang=sql>  
 
<source lang=sql>  
SQL> ALTER TABLE sales TRUNCATE PARTITION sales_q3;
+
ALTER TABLE sales TRUNCATE PARTITION sales_q3;
 
</source>
 
</source>
 +
 +
===파티션 속성 변경===
 +
<source lang=sql>
 +
ALTER TABLE PART2
 +
  STORAGE(NEXT 10M);
 +
-> PART2 테이블의 모든 PARTITION의 NEXT 값이 변경된다.
 +
 +
ALTER TABLE PART2
 +
    MODIFY PARTITION PART2_200901_NEW
 +
            STORAGE(MAXEXTENTS 1000);
 +
</source>
 +
 +
=== INDEX 관리 ===
 +
MAX를 SPLIT 한 경우 해당 파티션 인덱스를 반드시 REBUILD 해 주어야 한다.
 +
 +
=== 파티션 인덱스 상태 확인 ===
 +
SELECT INDEX_NAME
 +
    , PARTITION_NAME
 +
    , HIGH_VALUE
 +
    , STATUS
 +
    , TABLESPACE_NAME
 +
  FROM ALL_IND_PARTITIONS;
 +
 +
=== 인덱스 리빌드 ===
 +
# 로컬 인덱스
 +
ALTER INDEX 인덱스이름 REBUILD PARTITION 파티션이름;
 +
# 글로벌 인덱스
 +
ALTER INDEX 인덱스이름 REBUILD;

2018년 10월 20일 (토) 17:18 판

thumb_up 추천메뉴 바로가기


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;
</sql>

===파티션 이름 변경===
  sales 테이블의 sales_q4 파티션 이름을 sales_four로 변경하는 예제 입니다.

<source lang=sql> 
SQL> ALTER TABLE sales RENAME PARTITION sales_q4 TO sales_four;

5 파티션의 병합(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를 갱신


6 파티션의 분할(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);

7 파티션의 변경(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 ASSM_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

8 파티션의 테이블스페이스 변경[편집]

 sales 테이블의 sales_q3 파티션의 테이블스페이스를 ASSM_TBS5로 변경하는 예제 입니다.
ALTER TABLE sales 
 MOVE PARTITION sales_q3 
 TABLESPACE ASSM_TBS5;


9 파티션 데이터 TRUNCATE[편집]

 sales 테이블의 sales_q3 파티션을 TRUNCATE 하는 예제 입니다.
ALTER TABLE sales TRUNCATE PARTITION sales_q3;

10 파티션 속성 변경[편집]

ALTER TABLE PART2 
   STORAGE(NEXT 10M);
-> PART2 테이블의 모든 PARTITION의 NEXT 값이 변경된다.

ALTER TABLE PART2 
     MODIFY PARTITION PART2_200901_NEW 
            STORAGE(MAXEXTENTS 1000);

11 INDEX 관리[편집]

MAX를 SPLIT 한 경우 해당 파티션 인덱스를 반드시 REBUILD 해 주어야 한다.

12 파티션 인덱스 상태 확인[편집]

SELECT INDEX_NAME

    , PARTITION_NAME
    , HIGH_VALUE
    , STATUS
    , TABLESPACE_NAME
 FROM ALL_IND_PARTITIONS;

13 인덱스 리빌드[편집]

  1. 로컬 인덱스

ALTER INDEX 인덱스이름 REBUILD PARTITION 파티션이름;

  1. 글로벌 인덱스

ALTER INDEX 인덱스이름 REBUILD;