문서유형ㅣ기술정보
분야ㅣ관리/환경설정
적용제품버전ㅣTibero 7.2.4
문서번호ㅣTADTI172
개요
테이블 파티셔닝이란 테이블을 파티션(Partition)이라고 하는 보다 작은 단위로 나눔으로써 지속적인 데이터 증가로 인한 대용량 테이블 의 성능저하를 방지하고 운영관리를 보다 편리하게 하는 방법입니다.
테이블과 인덱스에 대하여 분할을 지원하며 각각의 파티션은 테이블의 컬럼과 제약조건에 대한 정의는 공유하지만 서로 다른 물리적인 속성을 갖는 별도의 세그 먼트로 관리할 수 있습니다.
다음은 파티션 테이블의 장점과 단점에 대한 설명입니다.
| 구분 | 설명 |
| 장점 |
|
| 단점 |
|
방법
레인지 파티션 테이블
테이블의 특정 컬럼의 범위를 기준으로 분할하는 방법으로 주로 일자로 관리하는 테이블에 적합하며 파티션 키를 중심으로 데이터가 어느 파티션에 존재하는지 파악할 수 있어 데이터 관리 측면에서 유리합니다.
하지만 테이블 파티 션에 대한 데이터 분산은 파티션 키에 의존하므로 특정 파티션에 데이터가 편중되는 현상이 발생할 수 있습니다.
생성 방법
CREATE TABLE <테이블명> (
<컬럼1>,
<컬럼2>,
<컬럼3>
)
PARTITION BY RANGE(<컬럼>) (
PARTITION <파티션명> VALUES LESS THAN (<값>),
PARTITION <파티션명> VALUES LESS THAN (<값>),
PARTITION <파티션명> VALUES LESS THAN (MAXVALUE))
ENABLE ROW MOVEMENT;
생성 예시
SQL> CREATE TABLE DEPT_PART_R (
DEPTNO NUMBER(4),
DEPTNAME VARCHAR(30 BYTE),
MGRNO NUMBER(6),
LOCNO NUMBER(4)
)
PARTITION BY RANGE(DEPTNO) (
PARTITION PART1 VALUES LESS THAN (11) ,
PARTITION PART2 VALUES LESS THAN (21) ,
PARTITION PART3 VALUES LESS THAN (31) ,
PARTITION PART4 VALUES LESS THAN (41) ,
PARTITION PARTMAX VALUES LESS THAN (MAXVALUE))
ENABLE ROW MOVEMENT;
Table 'DEPT_PART_R' created.
데이터 생성 및 레인지 파티션 테이블 생성 확인
1. 데이터를 생성합니다.
SQL> INSERT INTO DEPT_PART_R
SELECT LEVEL, CHR(65+MOD(LEVEL,26)), LEVEL, LEVEL FROM DUAL
CONNECT BY LEVEL <= 60;
60 rows inserted.
SQL> COMMIT;
Commit completed.2. 통계정보를 수집합니다.
SQL> begin
dbms_stats.gather_table_stats(OWNNAME=>'tibero',
TABNAME=>'DEPT_PART_R',
ESTIMATE_PERCENT=>100);
end;
/
PSM completed3. 데이터 적재 건수 및 파티션 테이블 생성을 확인합니다.
SQL> col TABLE_NAME format a15
SQL> col PARTITION_NAME format a15
SQL> col BOUND format a10
SQL> col NUM_ROWS format 999,999,999
SQL> SELECT TABLE_NAME, PARTITION_NAME, BOUND,
NUM_ROWS FROM USER_TAB_PARTITIONS
WHERE table_name = 'DEPT_PART_R';
TABLE_NAME PARTITION_NAME BOUND NUM_ROWS
--------------- --------------- ---------- ------------
DEPT_PART_R PART1 11 0
DEPT_PART_R PART2 21 0
DEPT_PART_R PART3 31 0
DEPT_PART_R PART4 41 0
DEPT_PART_R PARTMAX MAXVALUE 0
5 rows selected.
해시 파티션 테이블
파티션 키 값에 해시 함수를 적용하여 데이터를 분할하는 방식으로 데이터 관리 목적보다는 성능 향상을 위해 사용 합니다.
해시 키를 중심으로 데이터가 분산되므로 어느 파티션에 어떤 데이터가 존재하는지 알 수 없으나 파티션별 데 이터는 균등한 분포도를 보이므로 파티션 키의 분포도가 고른 컬럼이 효과적입니다.
생성 방법
CREATE TABLE <테이블명> (
<컬럼1>,
<컬럼2>,
<컬럼3>
)
PARTITION BY HASH(<컬럼>) (
PARTITION <파티션명>,
PARTITION <파티션명>,
PARTITION <파티션명>,
PARTITION <파티션명>)
ENABLE ROW MOVEMENT;
생성 예시
SQL> CREATE TABLE DEPT_PART_H (
DEPTNO NUMBER(4),
DEPTNAME VARCHAR(30 BYTE),
MGRNO NUMBER(6),
LOCNO NUMBER(4)
)
PARTITION BY HASH(DEPTNO) (
PARTITION HASH1,
PARTITION HASH2,
PARTITION HASH3,
PARTITION HASH4)
ENABLE ROW MOVEMENT;
Table 'DEPT_PART_H' created.
데이터 생성 및 해시 파티션 테이블 생성 확인
1. 데이터를 생성합니다.
SQL> INSERT INTO DEPT_PART_H
SELECT LEVEL, CHR(65+MOD(LEVEL,26)), LEVEL, LEVEL FROM DUAL
CONNECT BY LEVEL <= 48;
48 rows inserted.
SQL> COMMIT;
Commit completed.2. 통계정보를 수집합니다.
SQL> begin
dbms_stats.gather_table_stats(OWNNAME=>'tibero',
TABNAME=>'DEPT_PART_H',
ESTIMATE_PERCENT=>100);
end;
/
PSM completed.3. 데이터 적재 건수 및 파티션 테이블 생성을 확인합니다.
SQL> col TABLE_NAME format a15
SQL> col PARTITION_NAME format a15
SQL> col BOUND format a10
SQL> col NUM_ROWS format 999,999,999
SQL> SELECT TABLE_NAME, PARTITION_NAME, BOUND,
NUM_ROWS FROM USER_TAB_PARTITIONS
WHERE TABLE_NAME = 'DEPT_PART_H';
TABLE_NAME PARTITION_NAME BOUND NUM_ROWS
--------------- --------------- ---------- ------------
DEPT_PART_H HASH1 14
DEPT_PART_H HASH2 13
DEPT_PART_H HASH3 10
DEPT_PART_H HASH4 11
4 rows selected.
복합 파티션 테이블
분할한 각각의 파티션을 해시 또는 리스트 방식을 적용하여 다시 한번 서브 파티션으로 분할하는 방법입니다.
만약, 레인지-해시 방식을 사용할 경우 데이터 관리가 용이한 레인지 파티션과 성능 향상에 유리한 해시 파티션의 장점을 동시에 활용할 수 있습니다.
레인지-레인지 방식
생성 예시
SQL> CREATE TABLE DEPT_PART_RR (
DEPTNO NUMBER(4),
DEPTNAME VARCHAR(30 BYTE),
MGRNO NUMBER(6),
LOCNO NUMBER(4)
)
PCTFREE 10
INITRANS 2
PARTITION BY RANGE(DEPTNO)
SUBPARTITION BY RANGE(MGRNO)
(
PARTITION R_RANGE1 VALUES LESS THAN (10)
(SUBPARTITION R_RANGE1_SUB1 VALUES LESS THAN (10),
SUBPARTITION R_RANGE1_SUB2 VALUES LESS THAN (30),
SUBPARTITION R_RANGE1_SUB_MAX VALUES LESS THAN (MAXVALUE)
),
PARTITION R_RANGE2 VALUES LESS THAN (20)
(SUBPARTITION R_RANGE2_SUB1 VALUES LESS THAN (10),
SUBPARTITION R_RANGE2_SUB2 VALUES LESS THAN (30),
SUBPARTITION R_RANGE2_SUB_MAX VALUES LESS THAN (MAXVALUE)
),
PARTITION R_RANGE3 VALUES LESS THAN (30)
(SUBPARTITION R_RANGE3_SUB1 VALUES LESS THAN (10),
SUBPARTITION R_RANGE3_SUB2 VALUES LESS THAN (30),
SUBPARTITION R_RANGE3_SUB_MAX VALUES LESS THAN (MAXVALUE)
),
PARTITION R_RANGE4 VALUES LESS THAN (40)
(SUBPARTITION R_RANGE4_SUB1 VALUES LESS THAN (10),
SUBPARTITION R_RANGE4_SUB2 VALUES LESS THAN (30),
SUBPARTITION R_RANGE4_SUB_MAX VALUES LESS THAN (MAXVALUE)
),
PARTITION R_RANGEMAX VALUES LESS THAN (MAXVALUE)
(SUBPARTITION R_RANGEMAX_SUB1 VALUES LESS THAN (10),
SUBPARTITION R_RANGEMAX_SUB2 VALUES LESS THAN (30),
SUBPARTITION R_RANGEMAX_SUB_MAX VALUES LESS THAN (MAXVALUE)
))
ENABLE ROW MOVEMENT;
Table 'DEPT_PART_RR' created.
생성 확인 예시
SQL> set LINESIZE 150
SQL> col TABLE_NAME format a15
SQL> col PARTITION_NAME format a15
SQL> col SUBPARTITION_NAME format a20
SQL> col SUBPARTITION_NO format 999,999
SQL> col BOUND format a10
SQL> SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME, SUBPARTITION_NO,
BOUND FROM USER_TAB_SUBPARTITIONS
WHERE TABLE_NAME = 'DEPT_PART_RR';
TABLE_NAME PARTITION_NAME SUBPARTITION_NAME SUBPARTI BOUND
--------------- --------------- -------------------- -------- ----------
DEPT_PART_RR R_RANGE1 R_RANGE1_SUB1 1 10
DEPT_PART_RR R_RANGE1 R_RANGE1_SUB2 2 30
DEPT_PART_RR R_RANGE1 R_RANGE1_SUB_MAX 3 MAXVALUE
DEPT_PART_RR R_RANGE2 R_RANGE2_SUB1 1 10
DEPT_PART_RR R_RANGE2 R_RANGE2_SUB2 2 30
DEPT_PART_RR R_RANGE2 R_RANGE2_SUB_MAX 3 MAXVALUE
DEPT_PART_RR R_RANGE3 R_RANGE3_SUB1 1 10
DEPT_PART_RR R_RANGE3 R_RANGE3_SUB2 2 30
DEPT_PART_RR R_RANGE3 R_RANGE3_SUB_MAX 3 MAXVALUE
DEPT_PART_RR R_RANGE4 R_RANGE4_SUB1 1 10
DEPT_PART_RR R_RANGE4 R_RANGE4_SUB2 2 30
DEPT_PART_RR R_RANGE4 R_RANGE4_SUB_MAX 3 MAXVALUE
DEPT_PART_RR R_RANGEMAX R_RANGEMAX_SUB1 1 10
DEPT_PART_RR R_RANGEMAX R_RANGEMAX_SUB2 2 30
DEPT_PART_RR R_RANGEMAX R_RANGEMAX_SUB_MAX 3 MAXVALUE
15 rows selected.
레인지-리스트 방식
생성 예시
SQL> CREATE TABLE DEPT_PART_RL (
DEPTNO NUMBER(4),
DEPTNAME VARCHAR(30 BYTE),
MGRNO NUMBER(6),
LOCNO NUMBER(4)
)
PCTFREE 10
INITRANS 2
PARTITION BY RANGE(DEPTNO)
SUBPARTITION BY LIST(MGRNO)
(
PARTITION R_LIST1 VALUES LESS THAN (10)
(SUBPARTITION R_LIST1_SUB1 VALUES (10),
SUBPARTITION R_LIST1_SUB2 VALUES (30)
),
PARTITION R_LIST2 VALUES LESS THAN (20)
(SUBPARTITION R_LIST2_SUB1 VALUES (10),
SUBPARTITION R_LIST2_SUB2 VALUES (30)
),
PARTITION R_LIST3 VALUES LESS THAN (30)
(SUBPARTITION R_LIST3_SUB1 VALUES (10),
SUBPARTITION R_LIST3_SUB2 VALUES (30)
),
PARTITION R_LIST4 VALUES LESS THAN (40)
(SUBPARTITION R_LIST4_SUB1 VALUES (10),
SUBPARTITION R_LIST4_SUB2 VALUES (30)
),
PARTITION R_LISTMAX VALUES LESS THAN (MAXVALUE)
(SUBPARTITION R_LISTMAX_SUB1 VALUES (10),
SUBPARTITION R_LISTMAX_SUB2 VALUES (30)
))
ENABLE ROW MOVEMENT;
Table 'DEPT_PART_RL' created.생성 확인 예시
SQL> set LINESIZE 150
SQL> col TABLE_NAME format a15
SQL> col PARTITION_NAME format a15
SQL> col SUBPARTITION_NAME format a20
SQL> col SUBPARTITION_NO format 999,999
SQL> col BOUND format a10
SQL> SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME, SUBPARTITION_NO,
BOUND FROM USER_TAB_SUBPARTITIONS
WHERE TABLE_NAME = 'DEPT_PART_RL';
TABLE_NAME PARTITION_NAME SUBPARTITION_NAME SUBPARTI BOUND
--------------- --------------- -------------------- -------- ----------
DEPT_PART_RL R_LIST1 R_LIST1_SUB1 1 10
DEPT_PART_RL R_LIST1 R_LIST1_SUB2 2 30
DEPT_PART_RL R_LIST2 R_LIST2_SUB1 1 10
DEPT_PART_RL R_LIST2 R_LIST2_SUB2 2 30
DEPT_PART_RL R_LIST3 R_LIST3_SUB1 1 10
DEPT_PART_RL R_LIST3 R_LIST3_SUB2 2 30
DEPT_PART_RL R_LIST4 R_LIST4_SUB1 1 10
DEPT_PART_RL R_LIST4 R_LIST4_SUB2 2 30
DEPT_PART_RL R_LISTMAX R_LISTMAX_SUB1 1 10
DEPT_PART_RL R_LISTMAX R_LISTMAX_SUB2 2 30
10 rows selected.
레인지-해시 방식
생성 예시
SQL> CREATE TABLE DEPT_PART_RH (
DEPTNO NUMBER(4),
DEPTNAME VARCHAR(30 BYTE),
MGRNO NUMBER(6),
LOCNO NUMBER(4)
)
PCTFREE 10
INITRANS 2
PARTITION BY RANGE(DEPTNO)
SUBPARTITION BY HASH(MGRNO) (
PARTITION R_HASH1 VALUES LESS THAN (10) SUBPARTITIONS 4,
PARTITION R_HASH2 VALUES LESS THAN (20) SUBPARTITIONS 4,
PARTITION R_HASH3 VALUES LESS THAN (30) SUBPARTITIONS 4,
PARTITION R_HASH4 VALUES LESS THAN (40) SUBPARTITIONS 4,
PARTITION R_HASHMAX VALUES LESS THAN (MAXVALUE) SUBPARTITIONS 4
)
ENABLE ROW MOVEMENT;
Table 'DEPT_PART_RH' created.생성 확인 예시
SQL> col TABLE_NAME format a15
SQL> col PARTITION_NAME format a15
SQL> col SUBPARTITION_NO format 999,999,999
SQL> SELECT TABLE_NAME, PARTITION_NAME,
SUBPARTITION_NO FROM USER_TAB_SUBPARTITIONS
WHERE TABLE_NAME = 'DEPT_PART_RH';
TABLE_NAME PARTITION_NAME SUBPARTI
--------------- --------------- --------
DEPT_PART_RH R_HASH1 1
DEPT_PART_RH R_HASH1 2
DEPT_PART_RH R_HASH1 3
DEPT_PART_RH R_HASH1 4
DEPT_PART_RH R_HASH2 1
DEPT_PART_RH R_HASH2 2
DEPT_PART_RH R_HASH2 3
DEPT_PART_RH R_HASH2 4
DEPT_PART_RH R_HASH3 1
DEPT_PART_RH R_HASH3 2
DEPT_PART_RH R_HASH3 3
DEPT_PART_RH R_HASH3 4
DEPT_PART_RH R_HASH4 1
DEPT_PART_RH R_HASH4 2
DEPT_PART_RH R_HASH4 3
DEPT_PART_RH R_HASH4 4
DEPT_PART_RH R_HASHMAX 1
DEPT_PART_RH R_HASHMAX 2
DEPT_PART_RH R_HASHMAX 3
DEPT_PART_RH R_HASHMAX 4
20 rows selected.
리스트-레인지 방식
생성 예시
SQL> CREATE TABLE DEPT_PART_LR (
DEPTNO NUMBER(4),
DEPTNAME VARCHAR(30 BYTE),
MGRNO NUMBER(6),
LOCNO NUMBER(4)
)
PCTFREE 10
INITRANS 2
PARTITION BY LIST(DEPTNO)
SUBPARTITION BY RANGE(MGRNO)
(
PARTITION L_RANGE1 VALUES (10)
(SUBPARTITION L_RANGE1_SUB1 VALUES LESS THAN (10),
SUBPARTITION L_RANGE1_SUB2 VALUES LESS THAN (30),
SUBPARTITION L_RANGE1_SUB_MAX VALUES LESS THAN (MAXVALUE)
),
PARTITION L_RANGE2 VALUES (20)
(SUBPARTITION L_RANGE2_SUB1 VALUES LESS THAN (10),
SUBPARTITION L_RANGE2_SUB2 VALUES LESS THAN (30),
SUBPARTITION L_RANGE2_SUB_MAX VALUES LESS THAN (MAXVALUE)
),
PARTITION L_RANGE3 VALUES (30)
(SUBPARTITION L_RANGE3_SUB1 VALUES LESS THAN (10),
SUBPARTITION L_RANGE3_SUB2 VALUES LESS THAN (30),
SUBPARTITION L_RANGE3_SUB_MAX VALUES LESS THAN (MAXVALUE)
),
PARTITION L_RANGE4 VALUES (40)
(SUBPARTITION L_RANGE4_SUB1 VALUES LESS THAN (10),
SUBPARTITION L_RANGE4_SUB2 VALUES LESS THAN (30),
SUBPARTITION L_RANGE4_SUB_MAX VALUES LESS THAN (MAXVALUE)
))
ENABLE ROW MOVEMENT;
Table 'DEPT_PART_LR' created.생성 확인 예시
SQL> set LINESIZE 150
SQL> col TABLE_NAME format a15
SQL> col PARTITION_NAME format a15
SQL> col SUBPARTITION_NAME format a20
SQL> col SUBPARTITION_NO format 999,999
SQL> col BOUND format a10
SQL> SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME, SUBPARTITION_NO,
BOUND FROM USER_TAB_SUBPARTITIONS
WHERE TABLE_NAME = 'DEPT_PART_LR';
TABLE_NAME PARTITION_NAME SUBPARTITION_NAME SUBPARTI BOUND
--------------- --------------- -------------------- -------- ----------
DEPT_PART_LR L_RANGE1 L_RANGE1_SUB1 1 10
DEPT_PART_LR L_RANGE1 L_RANGE1_SUB2 2 30
DEPT_PART_LR L_RANGE1 L_RANGE1_SUB_MAX 3 MAXVALUE
DEPT_PART_LR L_RANGE2 L_RANGE2_SUB1 1 10
DEPT_PART_LR L_RANGE2 L_RANGE2_SUB2 2 30
DEPT_PART_LR L_RANGE2 L_RANGE2_SUB_MAX 3 MAXVALUE
DEPT_PART_LR L_RANGE3 L_RANGE3_SUB1 1 10
DEPT_PART_LR L_RANGE3 L_RANGE3_SUB2 2 30
DEPT_PART_LR L_RANGE3 L_RANGE3_SUB_MAX 3 MAXVALUE
DEPT_PART_LR L_RANGE4 L_RANGE4_SUB1 1 10
DEPT_PART_LR L_RANGE4 L_RANGE4_SUB2 2 30
DEPT_PART_LR L_RANGE4 L_RANGE4_SUB_MAX 3 MAXVALUE
12 rows selected.
리스트-리스트 방식
생성 예시
SQL> CREATE TABLE DEPT_PART_LL (
DEPTNO NUMBER(4),
DEPTNAME VARCHAR(30 BYTE),
MGRNO NUMBER(6),
LOCNO NUMBER(4)
)
PCTFREE 10
INITRANS 2
PARTITION BY LIST(DEPTNO)
SUBPARTITION BY LIST(MGRNO)
(
PARTITION L_LIST1 VALUES (10)
(SUBPARTITION L_LIST1_SUB1 VALUES (10),
SUBPARTITION L_LIST1_SUB2 VALUES (30)
),
PARTITION L_LIST2 VALUES (20)
(SUBPARTITION L_LIST2_SUB1 VALUES (10),
SUBPARTITION L_LIST2_SUB2 VALUES (30)
),
PARTITION L_LIST3 VALUES (30)
(SUBPARTITION L_LIST3_SUB1 VALUES (10),
SUBPARTITION L_LIST3_SUB2 VALUES (30)
),
PARTITION L_LIST4 VALUES (40)
(SUBPARTITION L_LIST4_SUB1 VALUES (10),
SUBPARTITION L_LIST4_SUB2 VALUES (30)
))
ENABLE ROW MOVEMENT;
Table 'DEPT_PART_LL' created.생성 확인 예시
SQL> set LINESIZE 150
SQL> col TABLE_NAME format a15
SQL> col PARTITION_NAME format a15
SQL> col SUBPARTITION_NAME format a20
SQL> col SUBPARTITION_NO format 999,999
SQL> col BOUND format a10
SQL> SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME, SUBPARTITION_NO,
BOUND FROM USER_TAB_SUBPARTITIONS
WHERE TABLE_NAME = 'DEPT_PART_LL';
TABLE_NAME PARTITION_NAME SUBPARTITION_NAME SUBPARTI BOUND
--------------- --------------- -------------------- -------- ----------
DEPT_PART_LL L_LIST1 L_LIST1_SUB1 1 10
DEPT_PART_LL L_LIST1 L_LIST1_SUB2 2 30
DEPT_PART_LL L_LIST2 L_LIST2_SUB1 1 10
DEPT_PART_LL L_LIST2 L_LIST2_SUB2 2 30
DEPT_PART_LL L_LIST3 L_LIST3_SUB1 1 10
DEPT_PART_LL L_LIST3 L_LIST3_SUB2 2 30
DEPT_PART_LL L_LIST4 L_LIST4_SUB1 1 10
DEPT_PART_LL L_LIST4 L_LIST4_SUB2 2 30
8 rows selected.
리스트-해시 방식
생성 예시
SQL> CREATE TABLE DEPT_PART_LH (
DEPTNO NUMBER(4),
DEPTNAME VARCHAR(30 BYTE),
MGRNO NUMBER(6),
LOCNO NUMBER(4)
)
PCTFREE 10
INITRANS 2
PARTITION BY LIST(DEPTNO)
SUBPARTITION BY HASH(MGRNO)
(
PARTITION L_HASH1 VALUES (10) SUBPARTITIONS 4,
PARTITION L_HASH2 VALUES (20) SUBPARTITIONS 4,
PARTITION L_HASH3 VALUES (30) SUBPARTITIONS 4,
PARTITION L_HASH4 VALUES (40) SUBPARTITIONS 4
)
ENABLE ROW MOVEMENT;
Table 'DEPT_PART_LH' created.생성 확인 예시
SQL> set LINESIZE 150
SQL> col TABLE_NAME format a15
SQL> col PARTITION_NAME format a15
SQL> col SUBPARTITION_NAME format a20
SQL> col SUBPARTITION_NO format 999,999
SQL> col BOUND format a10
SQL> SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME, SUBPARTITION_NO,
BOUND FROM USER_TAB_SUBPARTITIONS
WHERE TABLE_NAME = 'DEPT_PART_LH';
TABLE_NAME PARTITION_NAME SUBPARTITION_NAME SUBPARTI BOUND
--------------- --------------- -------------------- -------- ----------
DEPT_PART_LH L_HASH1 _TIBERO_SUBP500400 1
DEPT_PART_LH L_HASH1 _TIBERO_SUBP500500 2
DEPT_PART_LH L_HASH1 _TIBERO_SUBP500600 3
DEPT_PART_LH L_HASH1 _TIBERO_SUBP500700 4
DEPT_PART_LH L_HASH2 _TIBERO_SUBP500900 1
DEPT_PART_LH L_HASH2 _TIBERO_SUBP501000 2
DEPT_PART_LH L_HASH2 _TIBERO_SUBP501100 3
DEPT_PART_LH L_HASH2 _TIBERO_SUBP501200 4
DEPT_PART_LH L_HASH3 _TIBERO_SUBP501400 1
DEPT_PART_LH L_HASH3 _TIBERO_SUBP501500 2
DEPT_PART_LH L_HASH3 _TIBERO_SUBP501600 3
DEPT_PART_LH L_HASH3 _TIBERO_SUBP501700 4
DEPT_PART_LH L_HASH4 _TIBERO_SUBP501900 1
DEPT_PART_LH L_HASH4 _TIBERO_SUBP502000 2
DEPT_PART_LH L_HASH4 _TIBERO_SUBP502100 3
DEPT_PART_LH L_HASH4 _TIBERO_SUBP502200 4
16 rows selected.
해시-레인지 방식
생성 예시
SQL> CREATE TABLE DEPT_PART_HR (
DEPTNO NUMBER(4),
DEPTNAME VARCHAR(30 BYTE),
MGRNO NUMBER(6),
LOCNO NUMBER(4)
)
PCTFREE 10
INITRANS 2
PARTITION BY HASH(DEPTNO)
SUBPARTITION BY RANGE(MGRNO)
(
PARTITION H_RANGE1
(SUBPARTITION H_RANGE1_SUB1 VALUES LESS THAN (10),
SUBPARTITION H_RANGE1_SUB2 VALUES LESS THAN (30),
SUBPARTITION H_RANGE1_SUB_MAX VALUES LESS THAN (MAXVALUE)
),
PARTITION H_RANGE2
(SUBPARTITION H_RANGE2_SUB1 VALUES LESS THAN (10),
SUBPARTITION H_RANGE2_SUB2 VALUES LESS THAN (30),
SUBPARTITION H_RANGE2_SUB_MAX VALUES LESS THAN (MAXVALUE)
),
PARTITION H_RANGE3
(SUBPARTITION H_RANGE3_SUB1 VALUES LESS THAN (10),
SUBPARTITION H_RANGE3_SUB2 VALUES LESS THAN (30),
SUBPARTITION H_RANGE3_SUB_MAX VALUES LESS THAN (MAXVALUE)
),
PARTITION H_RANGE4
(SUBPARTITION H_RANGE4_SUB1 VALUES LESS THAN (10),
SUBPARTITION H_RANGE4_SUB2 VALUES LESS THAN (30),
SUBPARTITION H_RANGE4_SUB_MAX VALUES LESS THAN (MAXVALUE)
))
ENABLE ROW MOVEMENT;
Table 'DEPT_PART_HR' created.생성 확인 예시
SQL> set LINESIZE 150
SQL> col TABLE_NAME format a15
SQL> col PARTITION_NAME format a15
SQL> col SUBPARTITION_NAME format a20
SQL> col SUBPARTITION_NO format 999,999
SQL> col BOUND format a10
SQL> SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME, SUBPARTITION_NO,
BOUND FROM USER_TAB_SUBPARTITIONS
WHERE TABLE_NAME = 'DEPT_PART_HR';
TABLE_NAME PARTITION_NAME SUBPARTITION_NAME SUBPARTI BOUND
--------------- --------------- -------------------- -------- ----------
DEPT_PART_HR H_RANGE1 H_RANGE1_SUB1 1 10
DEPT_PART_HR H_RANGE1 H_RANGE1_SUB2 2 30
DEPT_PART_HR H_RANGE1 H_RANGE1_SUB_MAX 3 MAXVALUE
DEPT_PART_HR H_RANGE2 H_RANGE2_SUB1 1 10
DEPT_PART_HR H_RANGE2 H_RANGE2_SUB2 2 30
DEPT_PART_HR H_RANGE2 H_RANGE2_SUB_MAX 3 MAXVALUE
DEPT_PART_HR H_RANGE3 H_RANGE3_SUB1 1 10
DEPT_PART_HR H_RANGE3 H_RANGE3_SUB2 2 30
DEPT_PART_HR H_RANGE3 H_RANGE3_SUB_MAX 3 MAXVALUE
DEPT_PART_HR H_RANGE4 H_RANGE4_SUB1 1 10
DEPT_PART_HR H_RANGE4 H_RANGE4_SUB2 2 30
DEPT_PART_HR H_RANGE4 H_RANGE4_SUB_MAX 3 MAXVALUE
12 rows selected.
해시-리스트 방식
생성 예시
SQL> CREATE TABLE DEPT_PART_HL (
DEPTNO NUMBER(4),
DEPTNAME VARCHAR(30 BYTE),
MGRNO NUMBER(6),
LOCNO NUMBER(4)
)
PCTFREE 10
INITRANS 2
PARTITION BY HASH(DEPTNO)
SUBPARTITION BY LIST(MGRNO)
(
PARTITION H_LIST1
(SUBPARTITION H_LIST1_SUB1 VALUES (10),
SUBPARTITION H_LIST1_SUB2 VALUES (30)
),
PARTITION H_LIST2
(SUBPARTITION H_LIST2_SUB1 VALUES (10),
SUBPARTITION H_LIST2_SUB2 VALUES (30)
),
PARTITION H_LIST3
(SUBPARTITION H_LIST3_SUB1 VALUES (10),
SUBPARTITION H_LIST3_SUB2 VALUES (30)
),
PARTITION H_LIST4
(SUBPARTITION H_LIST4_SUB1 VALUES (10),
SUBPARTITION H_LIST4_SUB2 VALUES (30)
))
ENABLE ROW MOVEMENT;
Table 'DEPT_PART_HL' created.생성 확인 예시
SQL> set LINESIZE 150
SQL> col TABLE_NAME format a15
SQL> col PARTITION_NAME format a15
SQL> col SUBPARTITION_NAME format a20
SQL> col SUBPARTITION_NO format 999,999
SQL> col BOUND format a10
SQL> SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME, SUBPARTITION_NO,
BOUND FROM USER_TAB_SUBPARTITIONS
WHERE TABLE_NAME = 'DEPT_PART_HL';
TABLE_NAME PARTITION_NAME SUBPARTITION_NAME SUBPARTI BOUND
--------------- --------------- -------------------- -------- ----------
DEPT_PART_HL H_LIST1 H_LIST1_SUB1 1 10
DEPT_PART_HL H_LIST1 H_LIST1_SUB2 2 30
DEPT_PART_HL H_LIST2 H_LIST2_SUB1 1 10
DEPT_PART_HL H_LIST2 H_LIST2_SUB2 2 30
DEPT_PART_HL H_LIST3 H_LIST3_SUB1 1 10
DEPT_PART_HL H_LIST3 H_LIST3_SUB2 2 30
DEPT_PART_HL H_LIST4 H_LIST4_SUB1 1 10
DEPT_PART_HL H_LIST4 H_LIST4_SUB2 2 30
8 rows selected.
파티션 테이블 관리
파티션 삭제
사용 방법
ALTER TABLE <테이블명> DROP PARTITION <파티션명>사용 예시
SQL> ALTER TABLE DEPT_PART_R DROP PARTITION PARTMAX;
Table 'DEPT_PART_R' altered.
파티션 추가
사용 방법
ALTER TABLE <테이블명> ADD PARTITIOM <파티션명> VALUES LESS THAN (<값>)사용 예시
SQL> ALTER TABLE DEPT_PART_R ADD PARTITION PART6 VALUES LESS THAN (61);
Table 'DEPT_PART_R' altered.
파티션 분할
사용 방법
ALTER TABLE <테이블명> SPLIT PARTITION <분할할 파티션명> AT (<값>)
INTO (<PARTITION 값 미만일 때의 파티션명>, <PARTITION 값 이상일 때의 파티션명>)사용 예시
SQL> ALTER TABLE DEPT_PART_R SPLIT PARTITION PART6 AT (51)
INTO (PARTITION PART5, PARTITION PART6);
Table 'DEPT_PART_R' altered.
파티션명 변경
사용 방법
ALTER TABLE <테이블명> RENAME PARTITION <파티션명> TO <변경할 파티션명>사용 예시
SQL> ALTER TABLE DEPT_PART_R RENAME PARTITION PART1 TO PART1_NEW;
Table 'DEPT_PART_R' altered.
파티션 Tablespace 변경
사용 방법
ALTER TABLE <테이블명> MOVE PARTITION <파티션명> TABLESPACE <Tablespace명>사용 예시
SQL> ALTER TABLE DEPT_PART_R MOVE PARTITION PART1 TABLESPACE NEW_TS;
Table 'DEPT_PART_R' altered.
파티션 Truncate
사용 방법
ALTER TABLE <테이블명> TRUNCATE PARTITION <파티션명>사용 예시
SQL> ALTER TABLE DEPT_PART_R TRUNCATE PARTITION PART2;
Table 'DEPT_PART_R' altered.