DB/Postgresql

DB - partition 수평/수직 분할

개발 일기92 2024. 5. 22. 22:31

데이터베이스 분할(Partitioning)? 

데이터베이스 분할은 데이터를 여러 개의 작은 조각으로 나누는 작업으로 이렇게 분할된 데이터들은 데이터 관리 용이성, 성능, 가용성 등의 향상을 위해 사용되며 분할된 각 부분을 '파티션'이라고 부른다.

 

 

분할기법 종류 

수평 분할 (Horizontal Partitioning)

수평 분할은 데이터베이스의 테이블을 행(Row) 단위로 나누는 것을 의미한다.

예를 들어, 가상의 "고객 정보"라는 테이블에 각 고객의 이름, 나이, 주소, 이메일 등이 저장되어 있고, 이 "고객 정보" 테이블을 수평 분할하려고 하는 경우

  • 지역별로 분할: 고객 정보를 한 지역에 사는 고객들과 다른 지역에 사는 고객들로 나눈다. 예를 들어, 한 테이블은 미국 고객의 정보만을 포함하고, 다른 테이블은 유럽 고객의 정보만을 포함할 수 있음
  • 가입 연도별로 분할: 고객 정보를 가입한 연도에 따라 나눈다. 예를 들어, 2019년 가입자들을 한 테이블에, 2020년 가입자들을 다른 테이블에 저장함

이렇게 수평 분할을 하면, 각각의 작은 테이블은 데이터를 일부분만 담당하므로 데이터베이스 시스템의 성능이 향상될 수 있다. 또한 특정 지역이나 기간에 해당하는 데이터만 필요한 경우에 해당 테이블만을 검색하면 되기 때문에 검색 속도도 빨라진다. 수평 분할은 데이터를 더 작은 덩어리로 쪼개는 것이므로, 전체 데이터베이스에 걸쳐 쿼리가 분산되어 부하를 분산시키는 효과를 얻을 수 있음


장점:

  • 성능 향상: 데이터를 여러 파티션으로 나눠서 동시에 처리하니까 빨라짐.
  • 확장성: 새로운 서버를 추가하면 더 많은 데이터 처리 가능.
  • 보안: 각 파티션 별로 권한 따로 설정 가능.
  • 유지보수 쉬움: 작은 파티션 관리가 편함.

단점:

  • 데이터 중복: 특정 작업 때문에 데이터 중복될 수 있음.
  • 쿼리 복잡성: 데이터 찾기 위해 여러 파티션을 찾아야 할 수 있음.
  • 부하 균형: 파티션 간에 부하 균등하게 분산시키기 어려움.
  • 데이터 무결성 관리: 데이터 일관성 유지에 관리 어려움.

수직 분할 (Vertical Partitioning)

수직 분할 (Vertical Partitioning)

수직분할(Vertical Partitioning)은 테이블을 열(Column)을 기준으로 분할하는 형태이다. 만약 한 테이블에 수많은 컬럼이 존재한다면 디스크의 여러 블록에 데이터가 저장되므로 I/O 성능 저하를 불러올 수 있다. 이렇게 컬럼이 많아지면 로우 체이닝과 로우 마이그레이션이 많아져서 성능이 저하된다.

로우 체이닝(Row Chaining)
길이가 너무 커서 하나의 블록에 저장되지 못하고 다수의 블록에 나누어져 저장

로우 마이그레이션(Row Migration)
수정된 데이터를 해당 데이터 블록에 저장하지 못하고 다른 블록의 빈 공간에 저장

로우 체이닝과 로우 마이그레이션이 발생하여 많은 블록을 사용하게 되면, 불필요한 I/O가 발생하여 성능이 저하된다. 많은 I/O 발생은 성능에 직접적인 영향을 주므로 매우 중요한 문제다. 또한 데이터에 대한 범위 검색을 할 경우 더 많은 I/O를 유발하므로 성능 저하를 일으킨다. 수많은 컬럼을 동시에 조회하는 경우는 드물다. 각각의 조회 조건에 맞게 이용되는 컬럼들로 그룹을 묶어서 테이블 분할을 검토할 수 있다. 조회나 처리에 대한 분산을 가능하게 하는 칼럼들을 기준으로 테이블을 분리한다면 성능 개선에 큰 도움이 될 수 있다. 

 

예) 뉴스사이트를 찾는 고객들은 최근의 데이터를 가장 많이 조회할 것이다. 이 경우 1개월 전의 데이터를 다른 테이블에 두면, 훨씬 효율적으로 검색할 수 있다.

 

 

장점:

  • 성능 개선: 자주 사용하는 열만 가져오니까 쿼리 속도가 빨라짐.
  • 보안 강화: 중요한 열을 따로 저장해 더 안전함.
  • 쉬운 유지보수: 열 단위로 데이터베이스 관리가 편함.

단점:

  • 쿼리 복잡성: 필요한 정보를 얻기 위해 여러 테이블을 참조해야 할 수 있음.
  • 중복 데이터: 여러 테이블에 동일한 정보가 중복 저장될 수 있음.
  • 확장성 제한: 열 기반으로 분할되어 새로운 데이터 추가 어려울 수 있음.

수평분할 or 수직분할

테이블의 컬럼 개수와 데이터 양을 종합적으로 판단하여 양에 따른 대용량 테이블인지 판단 한다.

만약 컬럼 개수에 따른 것이라면, 트랜잭션의 특성에 따라 테이블을 1:1 형태로 분리하는 수직분할을 하면 된다.

반면 데이터 양에 따른 것이라면, 적절한 파티션을 선택하고 여러 개의 물리적 스페이스로 저장하는 수평분할을 하면 된다.

결론은 Row 단위의 트랜잭션 (수평분할) 인지 컬럼 단위의 트랜잭션 (수직분할) 인지 판단하면 된다. 

 

출처 : https://yunamom.tistory.com/291

'DB > Postgresql' 카테고리의 다른 글

Postgresql - Sharding  (0) 2025.02.23
Undo, Redo segment  (0) 2024.04.14
MVCC  (1) 2024.04.11
postgresql - vacuum  (0) 2024.04.11
Window 함수  (0) 2024.04.09