티스토리 뷰
DB 파티셔닝??
대용량 데이터를 처리하는데 있어서 매우 중요한 기술로서 대용량 데이터를 분할해서 저장하고, 분산 처리할 수 있는 방식을 뜻한다. 즉, 대용량 데이터나 인덱스를 작은 단위(Partition)로 나누어 관리하는 것이다.
파티셔닝은 데이터의 크기가 너무 커져 디스크 I/O에 대한 비용이 크게 증가할 때 성능을 향상시키기 위해 사용될 수 있다.
물리적으로 데이터 분할이 있지만 DB에 접근하는 애플리케이션 입장에서는 이를 알지 못한다.
"장점"
1. 성능 향상
- 데이터가 분산되어있기 때문에 Full Scan의 범위가 줄어 성능 향상을 야기한다.
- 논리적으로는 하나의 테이블이기 떄문에 쿼리문을 변경할 필요가 없다.
2. 높은 가용성
- 파티셔닝을 사용하면 데이터가 분산 저장되기에 하나의 파티션에 장애가 발생하더라도 전체 시스템에 영향을 미치지 않는다.
3. 관리 용이성
- 각 파티션을 독립적으로 백업 또는 복구할 수 있다.
- 개별 파티션 단위의 관리가 가능하다.
"단점"
- 테이블의 분할되어 관리되기 때문에 JOIN에 대한 비용이 증가한다.
- 파티션 키 값에 대한 별도의 관리가 필요하다.
- 인덱스와 테이블을 별도로 파티셔닝할 수 없다.
종류
1. 수평(horizontal) 파티셔닝
테이블을 수평기준, 행 기준으로 분리하는 것이다. 즉, 각 파티션의 스키마는 동일하다.
수평 파티셔닝에서 가장 중요한 것은 나누는 기준이 되는 Key이다. 설정된 키는 분할된 데이터베이스에 데이터가 가능한 한 균등하게 분산, 처리되도록 해야 한다. 즉, 어떤 파티션이 독단적으로 커지게되는 키 설정은 지양해야하는 것이다.
수평 파티셔닝을 하게되면 데이터의 개수가 작아지게되고 이에 따라 인덱스의 크기가 작아지기에 자연스레 성능은 향상되게 된다.
하지만 테이블 구조가 복잡해지고, 분산 처리 시 데이터 불일치 문제가 발생할 수도 있다.
2. 수직(vertical) 파티셔닝
테이블 수직기준, 열 기준으로 분리하는 것이다
.수직 분할의 가장 일반적인 용도는 자주 액세스하는 항목을 가져오는 것에대한 I/O의 비용을 줄이는 것이다.
위의 사진을 예로 들자면 물건 데이터를 고객에게 보여줄 때 Name과 Description, Price를 보여주는데 수직 파티셔닝을 통해 보여지지 않는 Stock과 LastOrdered에 대한 조회를 없애버렸기에 성능이 향상되는 것이라고 할 수 있다.
또한 Stock과 LastOrdered는 자주 데이터가 변경되는 컬럼인데 이를 파티셔닝함으로써 Update에 대한 성능도 끌어올릴 수 있고 파티셔닝된 Name, Description, Price 파티션을 캐싱해 둠으로써 애플리케이션의 성능을 끌어올릴 수도 있다.
파티셔닝의 분할 기준
테이블을 나누기 위한 기준인 파티션 키를 설정하는 방법의 종류이다.
범위 분할(Range Partitioning)
- 데이터의 값을 기준으로 일정 범위를 정하고, 그 범위 내의 데이터를 한 파티션에 할당하는 방식이다.
- 예를 들어 날짜나 금액과 같은 숫자 값을 기준으로 파티션하는 것
목록 분할(List Partioning)
- 데이터의 값을 목록으로 지정하고, 해당 목록에 해당하는 데이터를 한 파티션에 할당하는 방식이다.
- 예를 들어 지역이나 계정 유형과 같은 값을 기준으로 파티션하는 것이다.
해시 분할(Hash Partitioning)
- 데이터의 해시 값을 기준으로 파티션을 나누는 방식이다. 데이터의 값에 대해 일정한 알고리즘을 적용하여 해시 값을 게싼하고, 해당 값을 기준으로 파티션을 나눈다.
- 무작위로 분할된 데이터를 처리하는데 효과적이며, 분산 데이터베이스에서 많이 사용된다.
합성 분할(Composite Partitioning)
- 여러 파티션 키를 조합하여 파티션을 나누는 방식이다.
- 예를 들어 지역+날씨를 사용하여 파티션할 수 있다.
'데이터베이스' 카테고리의 다른 글
[DB]데이터베이스 Lock 그리고 Lock정보 설정 및 확인하기(H2 DB기준) (0) | 2023.10.12 |
---|---|
[DB]데이터베이스 클러스터링(Clustering)이란? (0) | 2023.05.17 |
@JoinColumn 실수... (0) | 2022.11.10 |
- Total
- Today
- Yesterday
- arraylist
- 백엔드#게시판
- 서블릿#Servlet
- 7568
- 파이썬
- 회고
- 백준
- 오류
- 자바
- 게시판#자바#JPA#Entity
- java
- 1316번
- this()
- controller
- 덧칠하기
- 백준#서강근육맨#20300
- MVC
- 1978
- 4673번
- 스프링
- 11659
- 사탕 게임#백준#3085
- list
- Spring
- 대충 만든 자판
- 프로그래머스
- 백준#잃어버린 괄호#1541
- querydsl
- HTTP#HTTP특징
- springboot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |