테이블 또는 인덱스 데이터를 파티션 단위로 나누어 저장하는 것
목적
- 성능
- 특정 DML과 Query의 성능을 향상시킨다.
- 주로 대용량 Data WRITE 환경에서 효율적이다.
- 특히, Full Scan에서 데이터 Access의 범위를 줄여 성능 향상을 가져온다.
- 많은 INSERT가 있는 OLTP 시스템에서 INSERT 작업을 작은 단위인 partition들로 분산시켜 경합을 줄인다.
- 가용성
- 물리적인 파티셔닝으로 인해 전체 데이터의 훼손 가능성이 줄어들고 데이터 가용성이 향상된다.
- 각 분할 영역(partition별로)을 독립적으로 백업하고 복구할 수 있다.
- table의 partition 단위로 Disk I/O을 분산하여 경합을 줄이기 때문에 UPDATE 성능을 향상시킨다.
- 관리용이성
- 큰 table들을 제거하여 관리를 쉽게 해준다.
장점
- 관리적 측면 : partition 단위 백업, 추가, 삭제, 변경
- 전체 데이터를 손실할 가능성이 줄어들어 데이터 가용성이 향상
- partition별로 백업 및 복구가 가능
- partition 단위로 I/O 분산이 가능하여 UPDATE 성능 향상
- 성능적 측면 : partition 단위 조회 및 DML수행
- 데이터 전체 검색 시 필요한 부분만 탐색해 성능 향상
- 즉, Full Scan에서 데이터 Access의 범위를 줄여 성능 향상
- 필요한 데이터만 빠르게 조회할 수 있기 때문에 쿼리 자체가 가벼움
단점
- table간 JOIN에 대한 비용이 증가
- table과 index를 별도로 파티셔닝할 수 없음
- table과 index를 같이 파티셔닝해야 함
종류
수평(horizontal) 파티셔닝
- 하나의 테이블의 각 행을 다른 테이블에 분산시키는 것
- 샤딩과 동일한 개념. 스키마를 복제한 후 샤드키를 기준으로 데이터를 나누는 것
- 장점
- 성능 향상: 데이터를 여러 파티션으로 나눠서 동시에 처리하니까 빨라짐
- 확장성: 새로운 서버를 추가하면 더 많은 데이터 처리 가능
- 보안: 각 파티션 별로 권한 따로 설정 가능
- 유지보수 쉬움: 작은 파티션 관리가 편함
- 단점
- 데이터 중복: 특정 작업 때문에 데이터 중복될 수 있음
- 쿼리 복잡성: 데이터 찾기 위해 여러 파티션을 찾아야 할 수 있음
- 부하 균형: 파티션 간에 부하 균등하게 분산시키기 어려움
- 데이터 무결성 관리: 데이터 일관성 유지에 관리 어려움
샤딩 종류
- 모듈러 샤딩: PK를 모듈러 연산한 결과로 DB를 라우팅 하는 방식
- 레인지 샤딩에 비해 데이터가 균일하게 분산
- DB를 추가 증설하는 과정에서 이미지 적재된 데이터의 재정렬이 필요
- 데이터량이 일정 수준에서 유지될 것으로 예상되는 데이터 성격을 가진 곳에 적용할 때 어울림
- 균일하게 분산된다는 점은 트래픽을 안정적으로 소화하면서도 DB 리소스를 최대한 활용할 수 있음
- 레인지 샤딩: PK의 범위를 기준으로 DB를 특정하는 방식
- 모듈러 샤딩에 비해 기본적으로 증설에 재정렬 비용이 들지 않는다.
- 일부 DB에 데이터가 몰릴 수 있다.
- 증설 작업에 드는 큰 비용이 들지 않는다는 점이다. 데이터가 급격히 증가할 여지가 있는 곳에 어울림
- 다만 활성 유저가 몰린 DB로 트래픽이나 데이터량이 몰릴 수 있기 때문에 적절한 range 기준을 잡는 것이 중요
- 디렉토리 샤딩: 별도의 조회 테이블을 사용해서 샤딩을 하는 경우
- 샤딩에 사용되는 시스템이나 알고리즘을 사용할 수 있다.
- 샤드를 동적으로 추가하는 것도 비교적 쉽다.
- 모든 읽기 및 쓰기 쿼리 전에 조회 테이블을 참조해야 하므로 오버헤드가 발생한다.
수직(vertical) 파티셔닝
- 테이블의 일부 열을 빼내는 형태로 분할
- 장점
- 성능 개선: 자주 사용하는 열만 가져오니까 쿼리 속도가 빨라짐
- 보안 강화: 중요한 열을 따로 저장해 더 안전함
- 쉬운 유지보수: 열 단위로 데이터베이스 관리가 편함
- 단점
- 쿼리 복잡성: 필요한 정보를 얻기 위해 여러 테이블을 참조해야 할 수 있음
- 중복 데이터: 여러 테이블에 동일한 정보가 중복 저장될 수 있음
- 확장성 제한: 열 기반으로 분할되어 새로운 데이터 추가 어려울 수 있음
분할 기준
분할은 ‘분할 키(partitioning key)’를 사용한다.
- 범위 분할 (range partitioning)
- 분할 키 값이 범위 내에 있는지 여부로 구분한다.
- 예를 들어, 우편 번호를 분할 키로 수평 분할하는 경우이다.
- 목록 분할 (list partitioning)
- 값 목록에 파티션을 할당 분할 키 값을 그 목록에 비추어 파티션을 선택한다.
- 예를 들어, Country 라는 컬럼의 값이 Iceland , Norway , Sweden , Finland , Denmark 중 하나에 있는 행을 빼낼 때 북유럽 국가 파티션을 구축 할 수 있다.
- 해시 분할 (hash partitioning)
- 해시 함수의 값에 따라 파티션에 포함할지 여부를 결정한다.
- 예를 들어, 4개의 파티션으로 분할하는 경우 해시 함수는 0-3의 정수를 돌려준다.
- 합성 분할 (composite partitioning)
- 상기 기술을 결합하는 것을 의미하며, 예를 들면 먼저 범위 분할하고, 다음에 해시 분할 같은 것을 생각할 수 있다.
- 컨시스턴트 해시법은 해시 분할 및 목록 분할의 합성으로 간주 될 수 있고 키 공간을 해시 축소함으로써 일람할 수 있게 한다.
728x90
반응형
'DB' 카테고리의 다른 글
스레드 동시성 문제 (0) | 2025.01.20 |
---|---|
B+Tree, B-Tree (0) | 2025.01.17 |
Index Range Scan (0) | 2025.01.16 |
Index의 랜덤 I/O와 순차 I/O (0) | 2025.01.16 |
Multi-column Index (0) | 2025.01.16 |