postgres range 파티션 구현

code_able·2023년 3월 11일
0

postgres로 데이터웨어하우스를 구축했으니
대량의 데이터를 다뤄보자

데이터를 대충 보니
연도별로 천만 단위의 row가 나올 것 같다.
쿼리 성능 향상을 위해 range 파티션이 필요할 것 같다.

이왕 하는거 파티셔닝에 대해 알아보자.

파티셔닝 목적

  1. 하나의 테이블이 너무 커서 물리적인 메모리 보다 용량이 클때
  2. 테이블이 너무 커서 관리가 어려울 때

파티셔닝 종류

  1. 수평 파티셔닝(샤딩)
  • 한 테이블을 같은 스키마를 갖는 여러 작은 테이블로 나누는 기법이다.
  • 파티션 키(샤드 키)를 기준으로 데이터를 분할한다.
  • 데이터의 수가 작아지고, 이에 따라 인덱스 개수도 작아져 성능 향상으로 이어진다.
  1. 수직 파티셔닝
  • 특정 컬럼을 기준으로 쪼개 저장하는 형태.
  • 하나의 엔터티를 2개 이상으로 분리하는 작업.
  • 자주 사용하는 컬럼 위주로 데이터를 분리하여 성능을 향상

수평 파티셔닝 기법

  1. Range Partitioning : 파티션 키의 범위를 기준으로 데이터를 균등하게 분할
create table product(
	id int not null,
	product_name varchar(255) not null,
	created_date date,
	primary key (id)
) partition by range(created_date);

create table product_2019 partition of product for values from ('2019-01-01') to ('2020-01-01');
create table product_2020 partition of product for values from ('2020-01-01') to ('2021-01-01');
create table product_2021 partition of product for values from ('2021-01-01') to ('2022-01-01');
create table product_2022 partition of product for values from ('2022-01-01') to ('2023-01-01');
  1. List Partitioning : 고정 된 키 값을 기준으로 데이터를 분할.
CREATE TABLE User (
  	id INT NOT NULL,
  	name VARCHAR(30),
  	date DATE NOT NULL DEFAULT '1970-01-01',
  	region VARCHAR(30) NOT NULL) 
  	PARTITION BY LIST (region) (
              PARTITION p0 VALUES IN ('KR/Seoul') ,
              PARTITION p1 VALUES IN ('KR/Busan') ,
              PARTITION p2 VALUES IN ('KR/Daejeon') ,
              PARTITION p3 VALUES IN (NULL));
  1. Hash Partitioning : Hash함수 결과값을 기준으로 데이터를 분할
CREATE TABLE User (
	id INT NOT NULL,
	name VARCHAR(30),
	date DATE NOT NULL DEFAULT '1970-01-01') 
	PARTITION BY HASH (id) PARTITIONS 10;

reference

profile
할수 있다! code able

0개의 댓글