-
[DB] 데이터 모델링 - Partitioning(파티셔닝)이란?DB/Modeling 2023. 1. 30. 21:29반응형
파티셔닝이 나온 배경은?
데이터는 시간이 지날수록 증가하는 속성을 가진다. 애플리케이션이 런칭돼고 사이즈가 증가하면서 DB자체가 VLDB(Very Large DB)로 돼게된다. 즉, 데이터의 량이 많아져 한 DB에 데이터를 모으게 돼면, 쿼리문 실행 시 속도가 느려질 뿐만 아니라, 보관 비용도 엄청나게 커지게 된다. 이런 문제를 해결하기 위해서 테이블 단위로 데이터를 나뉘는 방식을 고안하게 되었는데, 이것이 파티셔닝이다.
파티셔닝이란?
데이터 사이즈가 큰 테이블을 두 개 이상의 작은 테이블로 나누는 것을 파티셔닝이라고 한다. 보통 쿼리가 스캔할 데이터의 범위를 좁혀서 응답시간을 빠르게 하기 위한 목적으로 사용한다.
파티셔닝 이점
- 가용성 - 데이터를 나눠놨기 때문에 하나의 DB가 죽더라도 빠르게 살려 데이터를 잘 유지할 수 있다.
- 관리용이 - 큰 테이블을 나눴기 때문에 작은 단위에 테이블만 관리하여 관리가 용의해진다.
- 성능 - 테이블을 스캔하는 범위가 작아지기 때문에 성능이 좋아진다.
파티셔닝 단점
- 복잡도 증가 - join을 해야하는 쿼리가 많아지므로 join 비용이 증가한다.
파티셔닝 기준
Horizontal(수평) Partitioning
- 데이터를 row 단위로 나누는 것을 말함.
- row 단위이기 때문에 용량이나, row 수를 기준으로 나눔
- 대부분 Table naming을 기준으로 데이터 복사 후 해당 테이블을 클린하는 식으로 진행한다.
Vertical
- 데이터를 Column단위로 나누는 것을 말함
- 특정 컬럼의 분류 별로 나눈다. 국가별, 상품별, category별 등
- Column별로 나누기때문에 테이블이 만아져 애플리케이션 로직이 복잡해지는 단점이 있다.
- 단일 로우를 조회한다면 join을 추가로 해야한다.
- 집계 결과를 구한다면 테이블 별 집계 결과를 다시 합쳐야 한다.
- 마이그레이션 단계에서 데이터를 복하애야 한다.
- 결국 데이터가 많아지면, 수평적 파티션을 해야한다.
Partition 방식
- Range partitioning - 연속적인 숫자나 날짜 기준으로 파티셔닝한다.
- List partitioning - 특정 내용에 리스트 형식의 키 값 기준으로 파티셔닝한다.
- Hash Partitioning - 범위가 없는 데이터를 Hash 기준으로 균등하기 파티셔닝한다.
- Composite partitioning - 파티셔닝을 진행 했을 때 파티셔닝 자체가 너무 클 때 유용하게 사용된다. Range-hash는 Range 파티셔닝을 진행 하였지만 이마저도 커서 Hash 파티셔닝을 다시 한 모양이다.
예시
1. 범위 분할(Range Partitioning) - TimeLine
- Table_202111, Table_202112 식으로 월이나, 년별로 테이블을 새로 생성하여 해당 테이블을 Current테이블로 사용한다.
- 애플리케이션에서 시간 조건에 따라 테이블 이름을 결정하는 로직만 추가한다.
- 기간별로 데이터가 다르게 들어오면(skew), 특정 기간 테이블에만 부하가 생길 수 있다.
- 현재를 가리키는 테이블이 항상 바뀐다.
2. 범위 분할(Range Partitioning) - 기간 - 복사
- Table Name을 Table_current로 현재 기간에 존재하는 데이터를 넣고있다가 해당 기간이 도달하면 Table_202111같이 기간 테이블을 만든후 current 테이블의 내용을 새로 만든 테이블에 복사한다.
- Current는 비우고 새로 채운다.
- 최근 데이터에 대해서는 항상 같은 테이블에 접근하면 된다 .
- Current Table 이전의 데이터는 어떤 테이블인지 이름을 찾거나 결정하는 로직이 추가되어야 한다.
- 배치로 데이터 복사와 삭제가 이뤄지기 때문에 이때의 DB 부하가 크다
Partition 방식3 - 사이즈
- 테이블의 크기를 정해 놓고 이 크기에 도달하면 테이블을 하나 만들어 카피 하고 current 테이블은 비우는 방식이다.(백업하는 방식과 동일)
- 최근 데이터에 대해서는 항상 같은 테이블에 접근이 가능 하다.
- 테이블별 데이터 사이즈가 균일하다.
- 복사할 때 DB 부하가 생긴다
- 테이블을 찾는 로직이 더 복잡하다.
Rename 방식
- Current Table을 두고, 일정 조건이 되면 파티셔닝 테이블로 이름을 바꾼다
- 다시 create table하여 Current Table을 만드는 방식
- 위에 방법에서 사용하는 복사 과정이 없기 때문에 부하가 없다.
- 하지만, 이름을 바꾸는 동안 Client에서 바라보는 테이블이 존재 하지 않는 것이기 때문에 문제가 발생할 수 있다.
참고 문헌
http://www.gurubee.net/lecture/1906
https://nesoy.github.io/articles/2018-02/Database-Partitioning
반응형'DB > Modeling' 카테고리의 다른 글
[DB] 샤딩(sharding )이란? (0) 2023.01.31