[Oracle] Partitioning

ynkim·2023년 6월 8일
0

파티셔닝 테이블

  • 테이블의 특정 컬럼값(ex. month)을 기준으로 데이터를 분할해 놓은 테이블
  • 물리적으로 나눠졌지만 논리적으로는 1개의 테이블로 간주
  • 내부에 몇 개의 세그먼트를 생성하고 그것들이 논리적으로 하나의 오브젝트임을 메타 정보로 딕셔너리에 저장해 두는 것(오브젝트:세그먼트 = 1:M)

장점

  • 관리적 측면: 파티션 단위로 백업/추가/삭제/변경이 가능하다. 예를들어 한 파티션에 대해 삭제 작업을 할 때 파티셔닝되지 않은 테이블의 경우 해당 데이터를 찾은 뒤 건당 delete 작업을 해야하지만 파티셔닝 테이블의 경우 파티션 truncate/drop을 해주는 것으로 끝난다.
  • 성능적 측면: 파티션 단위로 조회/DML 수행이 가능하다. Hash 파티션을 사용하는 경우엔 Disk I/O 분산효과가 있기 때문에 I/O 읽기 성능이 향상 된다.

Range Partition

  • 범위로 구분되는 파티션 테이블
  • 주로 날짜 컬럼을 많이 사용
CREATE TABLE member (
	id VARCHAR2(16)
    , name VARCHAR2(30)
    , reg_date DATE
)
PARTITION BY RANGE (reg_date) (
	PARTITION reg_date1 VALUES LESS THAN (TO_DATE('2023/01/01', 'yyyy/mm/dd')),
    PARTITION reg_date2 VALUES LESS THAN (TO_DATE('2024/01/01', 'yyyy/mm/dd')),
    PARTITION reg_date3 VALUES LESS THAN (MAXVALUE)
);

List Partition

  • 범위가 아닌 특정한 값으로 구분되는 파티션 테이블
  • 주로 특정 구분자로 데이터의 구분이 가능한 경우 사용
CREATE TABLE member (
	id VARCHAR2(16)
    , name VARCHAR2(30)
    , country VARCHAR2(20)
)
PARTITION BY LIST (country) (
	PARTITION country1 VALUES ('USA', 'CANADA'),
    PARTITION country2 VALUES ('GERMANY', 'FRANCE', 'SPAIN'),
    PARTITION country_default VALUES (DEFAULT),
    PARTITION country_null VALUNES (NULL)
);

Hash Partition

  • 해시 함수에 의해 자동으로 설정한 파티션 갯수만큼 데이터가 분할되는 파티션 테이블
  • 데이터가 어느 파티션으로 들어갈 지 알 수 없음
  • 데이터를 분산 시켜서 Disk I/O 성능을 개선하는 것이 목적
  • 파티션의 개수를 2의 제곱으로 설정할 것을 권고(4, 8, 16, 32, ...)
  • Hot Block 현상: 스토리지의 특정 위치에 I/O가 몰리는 현상
CREATE TABLE member (
	id VARCHAR2(16)
    , name VARCHAR2(30)
    , reg_date DATE
)
PARTITION BY HASH (reg_date) PARTITIONS 4;

Composite Partition

  • 서브 파티션마다 세그먼트를 하나씩 할당하고, 서브 파티션 단위로 데이터를 저장
  • 주 파티션 키에 따라 1차적으로 데이터를 분배하고 서브 파티션 키에 따라 최종적으로 저장할 위치를 선정
  • 주 파티션으로는 Range, List Partition만 가능
  • 보관 기준과 처리 기준이 다를 때 사용하면 유용
CREATE TABLE member (
	id VARCHAR2(16)
    , name VARCHAR2(30)
    , reg_date DATE
    , country VARCHAR2(20)
)
PARTITION BY RANGE(reg_date)
SUBPARTITION BY LIST(country)
SUBPARTITION TEMPLATE
(
	SUBPARTITION country1 VALUES ('USA', 'CANADA'),
    SUBPARTITION country2 VALUES ('GERMANY', 'FRANCE', 'SPAIN'),
    SUBPARTITION country_default VALUES (DEFAULT)
)
(
	PARTITION reg_date1 VALUES LESS THAN (TO_DATE('2023/01/01', 'yyyy/mm/dd')),
    PARTITION reg_date2 VALUES LESS THAN (TO_DATE('2024/01/01', 'yyyy/mm/dd')),
    PARTITION reg_date3 VALUES LESS THAN (MAXVALUE)
);

Partition Index

파티션 테이블에 대해 2가지 종류의 파티션 인덱스를 생성할 수 있다.

Local Partitioned Index

  • 파티션 테이블과 똑같은 구성으로 인덱스를 파티션하는 것
  • 인덱스의 파티션을 구분하는 파티션키를 테이블의 파티션키와 같은 것을 사용
CREATE INDEX idx_member_01 on member (reg_date) LOCAL;
CREATE INDEX idx_member_01 on member (country) LOCAL;
  • 로컬 인덱스는 파티션키로 테이블의 파티션키를 사용하는 지에 의해서만 구분되는 것으로, 인덱스 키컬럼은 다른 것을 사용 가능
  • 다른 파티션키를 사용해 인덱스를 만들 수 없으므로 제약이 있음
  • 테이블에서 사용한 파티셔닝 종류와 다른 종류의 파티셔닝 방법을 사용할 수 없음

Global Partitioned Index

  • 로컬 인덱스와 달리 파티션 테이블의 파티션 구성을 따르지 않음
CREATE INDEX idx_member_01 on member (title) GLOBAL
PARTITION BY hash (title)
PARTITIONS 4;
  • 인덱스를 만들 때 테이블과 다른 파티션키, 다른 방식의 파티션 종류로 생성
  • 글로벌 파티션 인덱스의 경우 특정 파티션에 대해 작업이 이루어질 때 인덱스 전체를 다시 rebuild 해줘야 하기 때문에 가급적 로컬 파티션을 사용하는 것을 권장

0개의 댓글