파티셔닝(Partitioning)이란?
개념
: 테이블 또는 인덱스 데이터를 파티션(Partition) 단위로 나누어 저장하는 것을 말한다.
파티셔닝 왜 탄생했는가?
- 서비스의 크기가 점점 커지고 DB에 저장하는 데이터의 규모 또한 대용량화 되면서, 기존에 사용하는 DB 시스템의 용량(storage)의 한계와 성능(performance)의 저하를 가져오게 되었다.
- 즉, VLDB(Very Large DBMS)와 같이 하나의 DBMS에 너무 큰 table이 들어가면서 용량과 성능 측면에서 많은 이슈가 발생하게 되었고, 이런 이슈를 해결하기 위한 방법으로 table을 ‘파티션(partition)’이라는 작은 단위로 나누어 관리하는 ‘파티셔닝(Partitioning)’기법 이 나타나게 되었다.
‘파티셔닝(Partitioning)’기법을 통해 소프트웨어적으로 데이터베이스를 분산 처리하여 성능이 저하되는 것을 방지하고 관리를 보다 수월하게 할 수 있게 되었다.
파티셔닝의 목적
- 특정 DML과 Query의 성능을 향상시킨다.
- 주로 대용량 Data WRITE 환경에서 효율적이다.
- 특히, Full Scan에서 데이터 Access의 범위를 줄여 성능 향상을 가져온다.
- 많은 INSERT가 있는 OLTP 시스템에서 INSERT 작업을 작은 단위인 partition들로 분산시켜 경합을 줄인다.
[가용성(Availability)]
- 물리적인 파티셔닝으로 인해 전체 데이터의 훼손 가능성이 줄어들고 데이터 가용성이 향상된다.
각 분할 영역(partition별로)을 독립적으로 백업하고 복구할 수 있다.
table의 partition 단위로 Disk I/O을 분산하여 경합을 줄이기 때문에 UPDATE 성능을 향상시킨다.
[관리용이성(Manageability)]
- 큰 table들을 제거하여 관리를 쉽게 해준다.
DB 파티셔닝(Partitioning)의 장단점
장점
- 관리적 측면 : partition 단위 백업, 추가, 삭제, 변경
- 전체 데이터를 손실할 가능성이 줄어들어 데이터 가용성이 향상된다.
- partition별로 백업 및 복구가 가능하다.
- partition 단위로 I/O 분산이 가능하여 UPDATE 성능을 향상시킨다.
- 성능적 측면 : partition 단위 조회 및 DML수행
- 데이터 전체 검색 시 필요한 부분만 탐색해 성능이 증가한다.
- 즉, Full Scan에서 데이터 Access의 범위를 줄여 성능 향상을 가져온다.
- 필요한 데이터만 빠르게 조회할 수 있기 때문에 쿼리 자체가 가볍다.
단점
- table간 JOIN에 대한 비용이 증가한다.
- table과 index를 별도로 파티셔닝할 수 없다.
- table과 index를 같이 파티셔닝해야 한다.
DB 파티셔닝(Partitioning)의 종류
1. 수평(horizontal) 파티셔닝
![](https://velog.velcdn.com/images/kyeun95/post/8fe9e4ef-3b11-43c8-944c-670ecfd4ad39/image.png)
하나의 테이블의 각 행을 다른 테이블에 분산시키는 것이다.
특징
- 퍼포먼스, 가용성을 위해 KEY 기반으로 여러 곳에 분산 저장한다.
- 일반적으로 분산 저장 기술에서 파티셔닝은 수평 분할을 의미한다.
- 보통 수평 분할을 한다고 했을 때는 하나의 데이터베이스 안에서 이루어지는 경우를 지칭한다.
수평(horizontal) 파티셔닝 장단점
장점
- 데이터의 개수를 기준으로 나누어 파티셔닝한다.
- 데이터의 개수가 작아지고 따라서 인덱스의 개수도 작아지게 된다. 자연스럽게 성능은 향상된다.
단점
- 서버간의 연결과정이 많아진다.
- 데이터를 찾는 과정이 기존보다 복잡하기 때문에 latency가 증가하게 된다.
- 하나의 서버가 고장나게 되면 데이터의 무결성이 깨질 수 있다.
2. 수직(vertical) 파티셔닝
![](https://velog.velcdn.com/images/kyeun95/post/51fc26f1-62e6-42af-84f6-7d4d0c494ab4/image.png)
테이블의 일부 열을 빼내는 형태로 분할한다.정규화도 수직 파티셔닝과 관련된 과정이라고 할 수 있다. 하지만 수직 파티셔닝은 이미 정규화된 데이터를 분리하는 과정이라고 생각해야 한다.
특징
- 관계형 DB에서 3정규화와 같은 개념으로 접근하면 이해하기 쉽다.
- 하지만 수직 파티셔닝은 이미 정규화된 데이터를 분리하는 과정이다.
수직(vertical) 파티셔닝 장단점
장점
- 자주 사용하는 컬럼 등을 분리시켜 성능을 향상시킬 수 있다.
- 한 테이블을 SELECT하면 결국 모든 컬럼을 메모리에 올리게 되므로 필요없는 컬럼까지 올라가서 한 번에 읽을 수 있는 ROW가 줄어든다. 이는 I/O 측면에서 봤을 때 필요한 컬럼만 올리면 훨씬 많은 수의 ROW를 메모리에 올릴 수 있으니 성능상의 이점이 있다.
- 같은 타입의 데이터가 저장되기 때문에 저장 시 데이터 압축률을 높일 수 있다.
단점
- 데이터를 찾는 과정이 기존보다 복잡하므로 Latency가 증가한다.
DB 파티셔닝(Partitioning)의 분할 기준
데이터베이스 관리 시스템은 분할에 대해 각종 기준(분할 기법)을 제공하고 있다. 분할은 ‘분할 키(partitioning key)’를 사용한다.
![](https://velog.velcdn.com/images/kyeun95/post/25da7dfc-07e9-4cb4-9350-fb0a66036739/image.png)
1. 범위 분할 (range partitioning)
- 연속적인 숫자나 날짜를 기준으로 파티셔닝 한다.
- 분할 키 값이 범위 내에 있는지 여부로 구분한다.
- 우편 번호, 날짜 등의 데이터에 적합하다.
2. 목록 분할 (list partitioning)
- 값 목록에 파티션을 할당 분할 키 값을 그 목록에 비추어 파티션을 선택한다.
- 특정 파티션에 저장될 데이터에 대한 명시적 제어가 가능하다.
- 분포도가 비슷하며, 많은 SQL에서 해당 칼럼의 조건이 많이 들어오는 경우 유용하다.
예를 들어, Country 라는 컬럼의 값이 Iceland , Norway , Sweden , Finland , Denmark 중 하나에 있는 행을 빼낼 때 북유럽 국가 파티션을 구축 할 수 있다.
3. 해시 분할 (hash partitioning)
- 파티션 키(Key)의 해시 값에 의한 파티셔닝이 이루어진다.
- 균등한 데이터 분할이 가능하다.
- 특정 데이터가 어느 Hash 파티션에 있는지 판단하기 어렵다.
- 해시 함수의 값에 따라 파티션에 포함할지 여부를 결정한다.
- 파티션을 위한 범위가 없는 데이터에 적합하다.
예를 들어, 4개의 파티션으로 분할하는 경우 해시 함수는 0-3의 정수를 돌려준다.
4. 합성 분할 (composite partitioning)
- 위의 분할들을 결합하는 것을 의미한다. 즉, 파티션의 sub-partitioning을 뜻한다.
- 큰 파티션에 대한 I/O 요청을 여러 파티션으로 분산할 수 있다.
- 예를 들면 먼저 범위 분할하고, 다음에 해시 분할 같은 것을 생각할 수 있다.
Reference & Additional Resources
유익한 글 잘 봤습니다, 감사합니다.