-
DB 파티셔닝(partitioning) 이란?DB/DB 개념 정리 2020. 1. 22. 15:54
DB 파티셔닝이란 서비스의 크기가 점점 커지고 DB에 저장하는 데이터의 규모 또한 대용량화 되면서, 기존에 사용하는 DB 시스템의 용량(storage)의 한계와 성능(performance)의 저하 를 가져오게 되었다.
즉, VLDB(Very Large DBMS)와 같이 하나의 DBMS에 너무 큰 table이 들어가면서 용량과 성능 측면에서 많은 이슈가 발생하게 되었고, 이런 이슈를 해결하기 위한 방법으로 table을 ‘파티션(partition)’이라는 작은 단위로 나누어 관리하는 ‘파티셔닝(Partitioning)’기법 이 나타나게 되었다.‘파티셔닝(Partitioning)’기법을 통해 소프트웨어적으로 데이터베이스를 분산 처리하여 성능이 저하되는 것을 방지하고 관리를 보다 수월하게 할 수 있게 되었다.
파티셔닝의 이점들
가용성(Availability)
-
물리적인 Partitioning으로 인해 전체 데이터의 훼손 가능성이 줄어들고 데이터 가용성이 향상된다.
관리용이성(Manageability)
-
큰 Table들을 제거하여 관리를 쉽게 해준다.
성능(Performance)
-
특정 DML과 Query의 성능을 향상시킴, 주로 대용량 Data Write 환경에서 효율적이다.
-
많은 Insert가 있는 OLTP 시스템에서 Insert 작업들을 분리된 파티션들로 분산시켜 경합을 줄인다.
파티셔닝의 단점
-
Table간의 Join에 대한 비용이 증가한다.
-
테이블과 인덱스를 별도로 파티션 할수는 없다. 테이블과 인덱스를 같이 Partitioning 하여야 한다.
DB 파티셔닝(Partitioning)의 종류
1. 수평(horizontal) 파티셔닝
하나의 테이블의 각 행을 다른 테이블에 분산시키는 것이다.
개념-샤딩(Sharding) 과 동일한 개념
-스키마(schema)를 복제한 후 샤드키를 기준으로 데이터를 나누는 것을 말한다.
즉, 스키마(schema)가 같은 데이터를 두 개 이상의 테이블에 나누어 저장하는 것을 말한다.
특징-퍼포먼스, 가용성을 위해 KEY 기반으로 여러 곳에 분산 저장한다.
일반적으로 분산 저장 기술에서 파티셔닝은 수평 분할을 의미한다.
보통 수평 분할을 한다고 했을 때는 하나의 데이터베이스 안에서 이루어지는 경우를 지칭한다.예시
-고객의 데이터베이스를 CustomerId를 샤드키로 사용하여 샤딩하기로 하자.
0 ~ 10000 번 고객의 정보는 하나의 샤드에 저장하고 10001 ~ 20000 번 고객의 정보는 다른 샤드에 저장한다.
DBA는 데이터 엑세스 패턴과 저장 공간 이슈(로드의 적절한 분산, 데이터의 균등한 저장)를 고려하여 적절한 샤드키를 결정한다.
같은 주민 데이터를 처리하기 위해 스키마가 같은 ‘서현동주민 테이블’과 ‘정자동주민 테이블’을 사용하는 것을 말한다.
인덱스의 크기를 줄이고, 작업 동시성을 늘리기 위한 것이다.장점
-데이터의 개수를 기준으로 나누어 파티셔닝한다.
데이터의 개수가 작아지고 따라서 index의 개수도 작아지게 된다. 자연스럽게 성능은 향상된다.
단점
-서버간의 연결과정이 많아진다.
데이터를 찾는 과정이 기존보다 복잡하기 때문에 latency가 증가하게 된다.
하나의 서버가 고장나게 되면 데이터의 무결성이 깨질 수 있다.
2. 수직(vertical) 파티셔닝
-테이블의 일부 열을 빼내는 형태로 분할한다.
개념
-모든 컬럼들 중 특정 컬럼들을 쪼개서 따로 저장하는 형태를 의미한다.
스키마(schema)를 나누고 데이터가 따라 옮겨가는 것을 말한다.
하나의 엔티티를 2개 이상으로 분리하는 작업이다.
특징
-관계형 DB에서 3정규화와 같은 개념으로 접근하면 이해하기 쉽다.
하지만 수직 파티셔닝은 이미 정규화된 데이터를 분리하는 과정이다.
예시
-한 고객은 하나의 청구 주소를 가지고 있을 수 있다. 그러나 데이터의 유연성을 위해 다른 데이터베이스로 정보를 이동하거나 보안의 이슈 등을 이유로 CustomerId를 참조하도록 하고 청구 주소 정보를 다른 테이블로 분리할 수 있다.장점
-자주 사용하는 컬럼 등을 분리시켜 성능을 향상시킬 수 있다.
한 테이블을 SELECT하면 결국 모든 컬럼을 메모리에 올리게 되므로 필요없는 컬럼까지 올라가서 한 번에 읽을 수 있는 ROW가 줄어든다. 이는 I/O 측면에서 봤을 때 필요한 컬럼만 올리면 훨씬 많은 수의 ROW를 메모리에 올릴 수 있으니 성능상의 이점이 있다.
같은 타입의 데이터가 저장되기 때문에 저장 시 데이터 압축률을 높일 수 있다.https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html
https://nesoy.github.io/articles/2018-02/Database-Partitioning
'DB > DB 개념 정리' 카테고리의 다른 글
트랜잭션 ( Transaction ) 이란 (0) 2020.02.22 정규화란 (0) 2020.02.14 Connection Pool (0) 2020.02.06 -