행위

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

DB CAFE

(새 문서: ===파티션 테이블 생성=== PARTITION BY RANGE 절에 어떤 column들을 기준으로 하여 Partition을 나눌 것인지 지정을 하고, 각 Partition이 나누어 지는...)
 
2번째 줄: 2번째 줄:
 
   PARTITION BY RANGE 절에 어떤 column들을 기준으로 하여 Partition을 나눌 것인지 지정을 하고, 각 Partition이 나누어 지는 범위는 VALUES LESS THAN 절에서 지정해 주면 됩니다.
 
   PARTITION BY RANGE 절에 어떤 column들을 기준으로 하여 Partition을 나눌 것인지 지정을 하고, 각 Partition이 나누어 지는 범위는 VALUES LESS THAN 절에서 지정해 주면 됩니다.
  
+
<source lang=sql>
 
SQL> CREATE TABLE sales
 
SQL> CREATE TABLE sales
 
         (sales_no NUMBER,
 
         (sales_no NUMBER,
15번째 줄: 15번째 줄:
 
         PARTITION sales_q3 VALUES LESS THAN (2006, 01, 01) TABLESPACE ASSM_TBS3,
 
         PARTITION sales_q3 VALUES LESS THAN (2006, 01, 01) TABLESPACE ASSM_TBS3,
 
         PARTITION sales_q4 VALUES LESS THAN (2006, 07, 01) TABLESPACE ASSM_TBS4 );
 
         PARTITION sales_q4 VALUES LESS THAN (2006, 07, 01) TABLESPACE ASSM_TBS4 );
   
+
</source>   
 
   
 
   
  
23번째 줄: 23번째 줄:
 
   
 
   
 
-- Range 파티션 INSERt 예제
 
-- Range 파티션 INSERt 예제
 +
<source lang=sql>
 
INSERT INTO sales VALUES(1, 2004, 06, 12, 'scott', 2500);
 
INSERT INTO sales VALUES(1, 2004, 06, 12, 'scott', 2500);
 
INSERT INTO sales VALUES(2, 2005, 06, 17, 'jones', 4300);
 
INSERT INTO sales VALUES(2, 2005, 06, 17, 'jones', 4300);
30번째 줄: 31번째 줄:
 
INSERT INTO sales VALUES(6, 2006, 12, 22, 'tiger', 3300);
 
INSERT INTO sales VALUES(6, 2006, 12, 22, 'tiger', 3300);
 
COMMIT;
 
COMMIT;
 
+
</source>
 
--> 범위 초과로 ORA-14400 에러 발생
 
--> 범위 초과로 ORA-14400 에러 발생
 
INSERT INTO sales VALUES(6, 2006, 12, 22, 'tiger', 3300);  
 
INSERT INTO sales VALUES(6, 2006, 12, 22, 'tiger', 3300);  
39번째 줄: 40번째 줄:
 
-- 각 파티션 마다 데이터가 INSERT 되었는지는  
 
-- 각 파티션 마다 데이터가 INSERT 되었는지는  
 
-- 직접 SELECT 문으로 확인 해 보세요.
 
-- 직접 SELECT 문으로 확인 해 보세요.
 +
<source lang=sql>
 
SELECT sales_no FROM sales PARTITION (sales_q1); --> 1
 
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_q2); --> 2, 5
 
SELECT sales_no FROM sales PARTITION (sales_q3); --> 3
 
SELECT sales_no FROM sales PARTITION (sales_q3); --> 3
 
SELECT sales_no FROM sales PARTITION (sales_q4); --> 4
 
SELECT sales_no FROM sales PARTITION (sales_q4); --> 4
   
+
</source>   
 
   
 
   
  
51번째 줄: 53번째 줄:
 
   
 
   
 
-- sales 파티션 테이블에 새로운 파티션 sales_q5를 추가하는 예제 입니다.
 
-- sales 파티션 테이블에 새로운 파티션 sales_q5를 추가하는 예제 입니다.
 +
<source lang=sql>
 
SQL> ALTER TABLE sales
 
SQL> ALTER TABLE sales
 
     ADD PARTITION sales_q5 VALUES LESS THAN (MAXVALUE, MAXVALUE, MAXVALUE )
 
     ADD PARTITION sales_q5 VALUES LESS THAN (MAXVALUE, MAXVALUE, MAXVALUE )
 
     TABLESPACE ASSM_TBS5;
 
     TABLESPACE ASSM_TBS5;
   
+
</source>   
 
   
 
   
  
73번째 줄: 76번째 줄:
 
   sales 테이블의 sales_q4 파티션 이름을 sales_four로 변경하는 예제 입니다.
 
   sales 테이블의 sales_q4 파티션 이름을 sales_four로 변경하는 예제 입니다.
  
+
<source lang=sql>
 
SQL> ALTER TABLE sales RENAME PARTITION sales_q4 TO sales_four;
 
SQL> ALTER TABLE sales RENAME PARTITION sales_q4 TO sales_four;
   
+
</source>   
 
   
 
   
 
===파티션의 병합(MERGE)===
 
===파티션의 병합(MERGE)===
84번째 줄: 87번째 줄:
 
   
 
   
 
--  sales_q1 파티션과 sales_q2 파티션을 sales_q2 파티션으로 병합
 
--  sales_q1 파티션과 sales_q2 파티션을 sales_q2 파티션으로 병합
 +
<source lang=sql>
 
SQL> ALTER TABLE sales
 
SQL> ALTER TABLE sales
 
     MERGE PARTITIONS sales_q1, sales_q2 INTO PARTITION sales_q2
 
     MERGE PARTITIONS sales_q1, sales_q2 INTO PARTITION sales_q2
 
     UPDATE INDEXES; --> Local Index를 갱신
 
     UPDATE INDEXES; --> Local Index를 갱신
   
+
</source>   
 
   
 
   
  
97번째 줄: 101번째 줄:
 
   아래는 sales 파티션 테이블의 sales_q2 파티션을 (2005,01,01) 값을 기준으로 sales_q1 와 sales_q2로 파티션을 분할하는 예제 입니다.
 
   아래는 sales 파티션 테이블의 sales_q2 파티션을 (2005,01,01) 값을 기준으로 sales_q1 와 sales_q2로 파티션을 분할하는 예제 입니다.
  
+
<source lang=sql>
 
SQL> ALTER TABLE sales
 
SQL> ALTER TABLE sales
 
     SPLIT PARTITION sales_q2 AT (2005, 01, 01)
 
     SPLIT PARTITION sales_q2 AT (2005, 01, 01)
 
     INTO (PARTITION sales_q1 TABLESPACE ASSM_TBS1,
 
     INTO (PARTITION sales_q1 TABLESPACE ASSM_TBS1,
 
           PARTITION sales_q2 TABLESPACE ASSM_TBS2)
 
           PARTITION sales_q2 TABLESPACE ASSM_TBS2)
   
+
</source>   
 
   
 
   
 
 
===파티션의 변경(EXCHANGE)===
 
===파티션의 변경(EXCHANGE)===
 
   파티션의 EXCHAGEN는 파티션 데이터를 일반테이블로 생성하는 작업입니다. 물론 일반 테이블의 데이터를 파티션 테이블의 데이터로 생성 할 수도 있습니다.
 
   파티션의 EXCHAGEN는 파티션 데이터를 일반테이블로 생성하는 작업입니다. 물론 일반 테이블의 데이터를 파티션 테이블의 데이터로 생성 할 수도 있습니다.
112번째 줄: 115번째 줄:
 
   
 
   
 
-- 파티션 데이터를 일반테이블로 이동하기 위한 테이블을 생성 합니다.
 
-- 파티션 데이터를 일반테이블로 이동하기 위한 테이블을 생성 합니다.
 +
<source lang=sql>
 
SQL> CREATE TABLE sales_ex
 
SQL> CREATE TABLE sales_ex
 
       (sales_no NUMBER,
 
       (sales_no NUMBER,
120번째 줄: 124번째 줄:
 
         price NUMBER)
 
         price NUMBER)
 
     TABLESPACE ASSM_TBS1;
 
     TABLESPACE ASSM_TBS1;
 
+
</source>
 
 
 
-- 파티션 데이터를 일반 테이블로 변경 합니다.
 
-- 파티션 데이터를 일반 테이블로 변경 합니다.
 +
<source lang=sql>
 
SQL> ALTER TABLE sales
 
SQL> ALTER TABLE sales
 
     EXCHANGE PARTITION sales_q1  
 
     EXCHANGE PARTITION sales_q1  
 
     WITH TABLE sales_ex;
 
     WITH TABLE sales_ex;
 
+
</source>
  
 
-- 파티션 테이블의 데이터를 조회 해봅니다.
 
-- 파티션 테이블의 데이터를 조회 해봅니다.
 +
<source lang=sql>
 
SQL> SELECT sales_no  
 
SQL> SELECT sales_no  
 
     FROM sales PARTITION (sales_q1);  
 
     FROM sales PARTITION (sales_q1);  
 +
</source>
 
선택된 레코드가 없습니다.
 
선택된 레코드가 없습니다.
  
  
 
-- 파티션 데이터를 이동한 일반 테이블의 데이터를 조회 해봅니다.
 
-- 파티션 데이터를 이동한 일반 테이블의 데이터를 조회 해봅니다.
 +
<source lang=sql>
 
SQL> SELECT sales_no FROM sales_ex;  --> 1
 
SQL> SELECT sales_no FROM sales_ex;  --> 1
   
+
</source>   
 
   
 
   
  
142번째 줄: 149번째 줄:
 
   sales 테이블의 sales_q3 파티션의 테이블스페이스를 ASSM_TBS5로 변경하는 예제 입니다.
 
   sales 테이블의 sales_q3 파티션의 테이블스페이스를 ASSM_TBS5로 변경하는 예제 입니다.
  
+
<source lang=sql>
 
SQL> ALTER TABLE sales  
 
SQL> ALTER TABLE sales  
 
     MOVE PARTITION sales_q3  
 
     MOVE PARTITION sales_q3  
 
     TABLESPACE ASSM_TBS5;
 
     TABLESPACE ASSM_TBS5;
   
+
</source>   
 
   
 
   
  
152번째 줄: 159번째 줄:
 
   sales 테이블의 sales_q3 파티션을 TRUNCATE 하는 예제 입니다.
 
   sales 테이블의 sales_q3 파티션을 TRUNCATE 하는 예제 입니다.
  
+
<source lang=sql>
 
SQL> ALTER TABLE sales TRUNCATE PARTITION sales_q3;
 
SQL> ALTER TABLE sales TRUNCATE PARTITION sales_q3;
 +
</source>

2018년 8월 27일 (월) 17:42 판

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를 추가하는 예제 입니다.

SQL> ALTER TABLE sales
     ADD PARTITION sales_q5 VALUES LESS THAN (MAXVALUE, MAXVALUE, MAXVALUE )
     TABLESPACE ASSM_TBS5;


4 파티션 삭제[편집]

 Range, List 파티션만 가능 합니다.
 하나의 파티션은 반드시 남아 있어야 합니다.
 한번의 하나의 파티션만 삭제 가능 합니다. 여러 개의 파티션을 삭제하고자 할 때는 삭제 문장을 여러 번 실행 시켜야 합니다.


-- sales 테이블의 sales_q5 파티션을 삭제 SQL> 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로 파티션을 분할하는 예제 입니다.
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)

8 파티션의 변경(EXCHANGE)[편집]

 파티션의 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


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

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


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

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