Table Partitioning
- 대용량 테이블의 성능 향상 및 효율적인 관리를 위해 테이블을 특정 값을 기준으로 해 작은 단위로 나누는 것
Partition table의 장·단점
장점
- 데이터 장애시 해당 파티션을 제외한 파티션에 영향을 주지 않으므로 보다 안전하게 데이터 관리가 가능하다.
- 파티션 단위로 독립적인 관리가 가능하다.
- 사용자가 원하는 값으로 파티셔닝 할 수 있다.
- 테이블 스페이스 간 파티션 이동이 가능하다.
- 조인 시 파티션 간 및 파티션 내 병렬처리를 수행한다.
- 데이터 엑세스 범위를 줄여 성능을 향상시킬 수 있다.
- 테이블 파티션 단위로 디스크 I/O를 분산해 부하를 감소시킨다.
단점
- 파티션 키 값 변경에 대한 별도 관리가 필요하다.
- 컬럼의 일부로 파티셔닝 하고자 할 때 이에 해당하는 오버헤드 컬럼이 필요하다.
- 하나의 테이블을 작게 나누어 관리하기 때문에 관리에 주의가 필요하다.
Partition의 종류
Range Partitioning
- 특정 컬럼값(주로 날짜값)을 기준으로 파티션을 두는 방식
- 테이블 간 데이터가 불균형하게 들어갈 수 있다.
- 파티션을 결정하는 컬럼을 명시해야하며, MAXVALUE값은 NULL을 포함한다.
- log 등의 데이터에 적합
- Interval Partitioning: Range Partitioning 방식에서 파티션 추가 규칙을 지정해 새로운 데이터가 입력될 때 규칙에 의해 새로운 파티션을 생성한다.
xxxxxxxxxx
CREATE TABLE TEST_RANGE (
SEQ NUMBER(10),
PT_DATE DATE DEFAULT SYSDATE,
DATA VARCHAR2(10)
)
PARTITION BY RANGE(PT_DATE)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) -- INTERVAL PARTITIONING(파티션 자동생성)
(
PARTITION P0 VALUES LESS THAN (TO_DATE('20190501 000000', 'SYYYYMMDD HH24MISS', 'NLS_CALENDAR=GREGORIAN'))
);
Hash Partitioning
- Partition Key의 Hash 값으로 파티션을 두는 방식
- 변별력이 좋고 데이터 분포가 고른 컬럼을 키 컬럼으로 선정해야 효과적이다.
- 일반적으로 균등한 분포를 가진다.
- 균등 분배를 위해 파티션 개수를 명시해야 한다. (2의 거듭제곱 수)
- NULL 값은 첫 번째 파티션에 위치하게 된다.
xxxxxxxxxx
CREATE TABLESPACE oraTest
DATAFILE 'D:/app/user/oracle/oradata/orcl/p0.dbf'
SIZE 100M
AUTOEXTEND ON NEXT 10M;
CREATE TABLE TEST_HASH (
CUSTOMER_ID NUMBER,
CUSTOMER_NM VARCHAR(10),
REG_DATE DATE
)
PARTITION BY HASH(CUSTOMER_ID) PARTITIONS 16
STORE IN (oraTest);
List Partitioning
- 파티션 컬럼을 명시하고, 해당 컬럼 값을 기준으로 파티셔닝 하는 방식
- 연관되지 않거나 순서에 맞지 않는 데이터를 쉽게 Grouping 할 수 있다.
- 오직 하나의 컬럼으로만 파티션 키가 지정되어야 한다.
- 대소문자를 구분하며, NULL 값이 명시 가능하다.
- NULL을 포함한 모든 값은 한 번만 명시 가능하다.
- 범위 외 문자를 입력할 시 에러가 발생한다.
xxxxxxxxxx
CREATE TABLE TEST_LIST (
LIST_NO NUMBER,
LIST_DT DATE,
LIST_VAL VARCHAR2(10)
)
PARTITION BY LIST(LIST_VAL)
(
PARTITION P01 VALUES ('VAL01'),
PARTITION P02 VALUES ('VAL02'),
PARTITION P03 VALUES ('VAL03')
);
Composite Partitioning
- Range-List / Range-Hash / List-Hash / Range-Range 등의 조합된 파티션으로 구성
- 복합적인 성격을 띄는 데이터 분할에 용이하다.
- 파티션, 서브 파티션 단위의 관리가 가능하다.
x
CREATE TABLE TEST_COMP (
REG_ID NUMBER,
REG_DAY NUMBER(2),
REG_MON NUMBER(2),
REG_YEAR NUMBER(4)
)
PARTITION BY RANGE(REG_DAY, REG_MON, REG_YEAR)
SUBPARTITION BY HASH(REG_ID) SUBPARTITIONS 8
(
PARTITION P0 VALUES LESS THAN (01, 05, 2019)
);
Reference Partitioning
- PK-FK 관계를 통해 부모 테이블의 파티션 방식을 자식 테이블이 상속받아 적용한다.
- 참조되는 FK 컬럼은 NOT NULL 이어야 한다.
xxxxxxxxxx
CREATE TABLE TEST_PRNT (
PR_ID NUMBER PRIMARY KEY,
PR_DT DATE
)
PARTITION BY RANGE(PR_ID)
(
PARTITION P00 VALUES LESS THAN(100),
PARTITION P01 VALUES LESS THAN(200),
PARTITION P02 VALUES LESS THAN(300)
);
CREATE TABLE TEST_CHILD (
CH_ID NUMBER NOT NULL,
CONSTRAINT CH_ID_FK FOREIGN KEY(CH_ID) REFERENCES TEST_PRNT(PR_ID)
)
PARTITION BY REFERENCE(CH_ID_FK);
System Partitioning
- 파티션 키를 별도로 지정하지 않고 시스템이 알아서 파티셔닝을 해준다.
x
CREATE TABLE TEST_SYS (
DATA01 NUMBER,
DATA02 NUMBER
)
PARTITION BY SYSTEM;
'공부 > database' 카테고리의 다른 글
[Oracle] CHARSET, 한글 바이트 수 확인하기 (0) | 2020.10.25 |
---|---|
[Oracle] Database 접속 schema id, password 변경하기 (0) | 2020.10.25 |
[SQL] ORACLE, MySQL, MS SQL Server에서 user(schema) 생성, 권한부여하기 (0) | 2020.01.18 |
댓글