검수요청.png검수요청.png

"파티셔닝"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
(등장 배경)
 
(사용자 2명의 중간 판 12개는 보이지 않습니다)
1번째 줄: 1번째 줄:
'''파티셔닝'''(partitioning)은 데이터베이스를 여러 부분으로 분할하는 것이다. 데이터베이스의 분할은 중요한 튜닝 기법으로 데이터가 너무 커졌을때, 조회하는 시간이 길어졌을 때 또는 관리 용이성, 성능, 가용성 등의 향상을 이유로 행해지는 것이 일반적이다. 분할된 각 부분은 '파티션'이라고 부른다. 가장 일반적인 것은 분산 데이터베이스 분할인데 각 파티션은 여러 노드에 분산 배치되어 사용자가 각 노드에서 로컬 트랜잭션을 수행 할 수 있다. 이것은 가용성과 보안을 유지하면서 특정 뷰에 관한 일반 트랜잭션의 성능을 향상시켜준다. 데이터베이스의 분할, 각각 작은 데이터베이스가 되도록 하는 분할 방법과 하나의 테이블과 같이 선택된 요소만 분리하는 방법이 있다. <ref name="위키백과">〈[https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EB%B6%84%ED%95%A0 데이터베이스_분할]〉, 《위키백과》</ref>
+
'''파티셔닝'''(partitioning)은 [[데이터베이스]]를 여러 부분으로 분할하는 것이다. 데이터베이스의 분할은 중요한 튜닝 기법으로 데이터가 너무 커졌을때, 조회하는 시간이 길어졌을 때 또는 관리 용이성, 성능, [[가용성]] 등의 향상을 이유로 행해지는 것이 일반적이다. 분할된 각 부분은 '파티션'이라고 부른다. 가장 일반적인 것은 분산 데이터베이스 분할인데 각 [[파티션]]은 여러 노드에 분산 배치되어 사용자가 각 노드에서 로컬 트랜잭션을 수행 할 수 있다. 이것은 가용성과 보안을 유지하면서 특정 뷰에 관한 일반 트랜잭션의 성능을 향상시켜준다. 데이터베이스의 분할, 각각 작은 데이터베이스가 되도록 하는 분할 방법과 하나의 테이블과 같이 선택된 요소만 분리하는 방법이 있다. <ref name="위키백과">〈[https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EB%B6%84%ED%95%A0 데이터베이스_분할]〉, 《위키백과》</ref>
  
 
== 개요 ==
 
== 개요 ==
파티셔닝은 퍼포먼스, availability, maintainability 를 목적으로 논리적인 데이터를 다수의 entity로 분할하는 행위를 말한다. 대부분의 데이터베이스 관리 시스템에서 지원하지만 Mysql 5.1 미만에서는 지원하지 않는다. 샤딩 또한 이 파티셔닝의 종류 중 하나이다. <ref name="네이버 블로그">〈[https://rokking1.blog.me/221318669543 파티셔닝의 정의와 종류 그리고 샤딩]〉, 《네이버 블로그》</ref>즉, 큰 테이블이나 데이터베이스를 관리하기 쉬운 파티션이라는 작은 단위로 물리적으로 분할하는 것을 말한다. 물리적인 데이터 분할이 있더라도, 데이터베이스에 접근하는 애플리케이션 입장에서는 이를 인식하지 못한다. <ref name="블로그"></ref>
+
[[파티셔닝]]에는 일반적으로 행으로 파티션을 나누는 [[수평 파티셔닝]]과 컬럼별로 파티셔닝을 나누는 [[수직 파티셔닝]] 두 가지 방법이 있다. 보통 일반적으로는 수평 파티셔닝을 사용한다. 파티셔닝은 퍼포먼스, availability, maintainability 를 목적으로 논리적인 데이터를 다수의 entity로 분할하는 행위를 말한다. [[인덱스]]는 임의의 키 값의 따라 행 데이터 위치를 식별한다. 이 때 사용하는 기능인 파티셔닝은 테이블을 여러 개의 파티션으로 분할하여 키의 값에 따라 어떤 파티션에 속하는 행인지 배분하는 역할을 한다. <ref name="티스토리">〈[https://brocess.tistory.com/205 데이터베이스(DB) 파티셔닝이란?]〉, 《티스토리》</ref>
 +
대부분의 데이터베이스 관리 시스템에서 지원하지만 Mysql 5.1 미만에서는 지원하지 않는다. 샤딩 또한 이 파티셔닝의 종류 중 하나이다. <ref name="네이버 블로그">〈[https://rokking1.blog.me/221318669543 파티셔닝의 정의와 종류 그리고 샤딩]〉, 《네이버 블로그》</ref>즉, 큰 테이블이나 데이터베이스를 관리하기 쉬운 파티션이라는 작은 단위로 물리적으로 분할하는 것을 말한다. 물리적인 데이터 분할이 있더라도, 데이터베이스에 접근하는 애플리케이션 입장에서는 이를 인식하지 못한다. <ref name="블로그"></ref>
  
 
== 등장 배경 ==
 
== 등장 배경 ==
서비스의 크기가 점점 커지고 데이터베이스에 저장하는 데이터의 규모 또한 대용량화가 되면서, 기존에 사용하는 데이터베이스 시스템의 용량의 한계와 성능의 저하를 가져오면서 초대형 데이터베이스와 같이 하나의 데이터베이스에 너무 큰 테이블이 드러가게 되면서 이러한 문제점을 해결하기 위하여 테이블을 '파티션'이라는 작은 단위로 나누어 관리하는 '파티셔닝'기법이 나타나게 된것이다. 파티셔닝 기법이 나타나면서 소프트웨어적으로 데이터베이스를 분산처리하여 성능이 저하되는 것을 방지하고 관리를 보다 수월하게 할 수 있게 되었다. <ref name="블로그">〈[https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html [DB]_DB_파티셔닝(Partitioning)이란]〉, 《블로그》</ref>
+
서비스의 크기가 점점 커지고 데이터베이스에 저장하는 데이터의 규모 또한 대용량화가 되면서, 기존에 사용하는 데이터베이스 시스템의 용량의 한계와 성능의 저하를 가져오면서 초대형 데이터베이스와 같이 하나의 데이터베이스에 너무 큰 테이블이 들어가게 되면서 이러한 문제점을 해결하기 위하여 테이블을 '파티션'이라는 작은 단위로 나누어 관리하는 '파티셔닝'기법이 나타나게 된것이다. 파티셔닝 기법이 나타나면서 소프트웨어적으로 데이터베이스를 분산처리하여 성능이 저하되는 것을 방지하고 관리를 보다 수월하게 할 수 있게 되었다. <ref name="블로그">〈[https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html [DB]_DB_파티셔닝(Partitioning)이란]〉, 《블로그》</ref>
  
 
== 목적 ==
 
== 목적 ==
1. 성능(Performance)
+
=== 성능(Performance) ===
* 특정 데이터 조작 언어(DML)와 쿼리(Query)의 성능을 향상시킨다.
+
* 특정 데이터 조작 언어(DML)와 [[쿼리]](Query)의 성능을 향상시킨다.
 
* 주로 대용량 데이터 Write 환경에서 효율적이다.  
 
* 주로 대용량 데이터 Write 환경에서 효율적이다.  
 
* 풀스캔에서 데이터 허용의 범위를 줄여 성능을 향상시킨다.
 
* 풀스캔에서 데이터 허용의 범위를 줄여 성능을 향상시킨다.
 
* 많은 테이블이 있는 온라인 트랜잭션 처리 시스템에서 테이블 작업을 작은 단위인 파티션들로 분산시켜 경합을 줄인다.
 
* 많은 테이블이 있는 온라인 트랜잭션 처리 시스템에서 테이블 작업을 작은 단위인 파티션들로 분산시켜 경합을 줄인다.
  
2. 가용성(Availability)
+
=== 가용성(Availability) ===
 
* 물리적인 파티셔닝으로 인하여 전체 데이터의 훼손 가능성이 줄어들고 데이터 가용성이 향상된다.
 
* 물리적인 파티셔닝으로 인하여 전체 데이터의 훼손 가능성이 줄어들고 데이터 가용성이 향상된다.
 
* 테이블의 파티션 단위로 Disk I/O 를 분산하여 경합을 줄이므로 업데이트 성능을 향상시킨다.
 
* 테이블의 파티션 단위로 Disk I/O 를 분산하여 경합을 줄이므로 업데이트 성능을 향상시킨다.
 
* 각 분할 영역으로 독립적으로 백업하고 복구할 수 있다.
 
* 각 분할 영역으로 독립적으로 백업하고 복구할 수 있다.
  
3. 관리용이성 (Manageability)
+
=== 관리용이성 (Manageability) ===
 
* 큰 테이블을 제거하여 관리를 쉽게 해준다. <ref name="블로그"></ref>
 
* 큰 테이블을 제거하여 관리를 쉽게 해준다. <ref name="블로그"></ref>
  
 +
== 특징 ==
 +
=== 장점 ===
 +
Query performance 가 특정 상황에서는 아주 향상될 수 있다. 특히, 대부분 많이 접근되는 행이 하나나 몇개의 파티셔닝에 집중되어 있다면 파티셔닝 자체가 인덱스 사이즈를 줄이는 것이 가능하고, 때로는 많이 사용하는 부분을 메모리에 모두 올리는 것이 가능할 수 있기 때문이다. 필요한 데이터만 빠르게 조회가 가능하기 때문에 쿼리 자체가 가볍다. 하나의 파티션에 큰 부분을 접근하는 쿼리나 업데이트에서 성능 향상이 가능하다. 인덱스를 타거나 랜덤하게 전체의 테이블에 있는 데이터를 읽는 대신에 하나의 파티션에서 순차적인 스캔이 가능하기 때문이다. 즉 Full Scan에서 데이터 허용 범위를 줄여 성능 향상을 가져온다. 대량의 데이터를 올리거나 삭제하는 것이 파티션을 통째로 다룸으로써 가능하다. 물론 요구사항이 파티션 디자인 시에 계획이 되었을때 이다. 잘 사용하지 않는 데이터는 더 저렴하고 상대적으로 느린 저장소에 따로 저장이 가능하다. 그리고 파티션별로 백업 및 복구가 가능하며 파티션 단위로 I/O 분산이 가능하여 업데이트 성능을 향상시킨다.
 +
 +
=== 단점 ===
 +
테이블간 JOIN에 대한 비용이 증가하고 테이블과 인덱스를 따로 파티셔닝 할 수 없다. 데이터를 입력 받았을때 어디에 넣어야 하는지에 대한 연산 오버헤드가 발생이 가능하고 인덱스만으로 해결되는 부분 파티셔닝을 적용하였을때는 오히려 성능이 나빠질 수가 있다. <ref name="티스토리"></ref>
  
 +
== 종류 ==
 +
=== 수평(horizontal) 파티셔닝 ===
 +
수평 파티셔닝이란 [[샤딩]](Sharding)과 동일한 개념으로써 [[스키마]](schema)를 복제한 후 샤드키를 기준으로 데이터를 나누는 것을 말한다. 즉 스키마가 같은 데이터를 두 개 이상의 테이블에 나누어 저장하는 것을 말한다. 하나의 테이블의 각 행을 다른 테이블에 분산시키는 것이다. 수평 파티셔닝은 퍼포먼스, 가용성을 위하여 key를 기반으로 여러 곳에 분산 저장한다. 그리고 일반적으로 분산 저장 기술에서 파티셔닝은 수평 분할을 의미한다. 보통 수평 분할을 한다고 하였을 때는 하나의 데이터베이스 안에서 이루어지는 경우를 지칭한다. 장점에는 데이터의 개수를 기준으로 나누어 파티셔닝 하며, 데이터의 개수가 작아지고 따라서 데이터베이스의 개수도 작아지게 된다. 자연스럽게 성능은 향상된다. 단점은 서버 간 연결 과정이 많아지고 데이터를 찾는 과정이 기존보다 복잡해 지연시간이 증가하나. 또한 하나의 서버가 고장나게 된다면 데이터의 무결성이 깨질 가능성이 있다.
  
== 특징 ==
+
=== 수직(vertical) 파티셔닝 ===
 +
수직 파티셔닝이란 모든 [[컬럼]]들 중 특정 컬럼들을 쪼개어 따로 저장하는 형태를 의미한다. 주로 순차적인 데이터를 관리하는 테이블에 많이 사용한다. 스키마를 나누고 데이터가 따라 옮겨가는 것을 말하며 하나의 entity를 2개 이상으로 분리하는 작업으로 테이블의 일부 열을 빼내는 형태로 분할한다. 관계형 데이터베이스에서 3정규화와 같은 개념으로 접근하면 이해하기 쉽다. 하지만 수직 파티셔닝은 이미 정규화된 데이터를 분리하는 과정이다. 수직 파티셔닝을 사용하면 자주 사용하는 컬럼 등을 분리시켜 성능을 향상시킬 수 있다. 그리고 한 테이블을 선택하면 결국 모든 컬럼을 메모리에 올리게 되므로써 필요하지 않은 컬럼까지 올라가서 한번에 읽을 수 있는 열이 줄어든다. 이는 I/O  측면에서 본다면 필요한 컬럼만 올리면 훨씬 많은 수의 열을 메모리에 올릴 수 있으니 성능상의 이점이 있으며 같은 타입의 데이터가 저장되기 때문에 저장 시 데이터의 압축률을 높일 수 있다. <ref name="블로그"></ref>
  
 +
=== 해시(Hash) 파티셔닝 ===
 +
해시 파티셔닝은 특정 컬럼 값에 해시 함수를 적용하여 분할하는 방식으로, 데이터의 관리 보다는 성능 향상에 목적을 둔다. 레인지 파티셔닝은 각 범위에 따라 데이터의 양이 일정하지 않아 분포도가 일정하지 않은 단점이 있지만, 해시 파티셔닝은 이러한 단점을 보완하여 일정한 분포도를 가진 파티션으로 나누고, 균등한 분포도를 가질 수 있도록 조율하여 병렬 프로세싱으로 성능을 높인다. 실제로 분포도를 정의하기 어려운 테이블을 파티셔닝을 할 때 많이 이용하고 2의 제곱수로 파티셔닝하는 것이 일반적이다. 해시 파티셔닝으로 구분된 파티션들은 동일한 논리, 물리적 속성을 가진다. 또한 레인지 파티션과 달리 각 파티션에 지정된 값들을 데이터베이스 관리 시스템이 결정하므로 각 파티션에 어떤 값들이 들어있는지 알 수가 없다. 하지만 대용량의 분포도가 일정치 않은 테이블을 마이그레이션 할 때는 프로그램 병렬 방식과 유용하게 쓰일 수 있다. <ref name="ZD Net Korea">〈[http://www.zdnet.co.kr/view/?no=00000039137247 (DB 성능관리 2% 채우기) ② 테이블 파티셔닝의 재발견]〉, 《ZD Net Korea》</ref>
  
== 종류 ==
+
=== 레인지 (Range) 파티셔닝 ===
* 수평(horizontal) 파티셔닝
+
레인지 파티셔닝은 연속적인 숫자나 날짜를 기준으로 파티셔닝 한다. 일별, 월별, 분기별 등 의 데이터에 적합하고 손 쉬운 관리 기법 제공에 따른 관리 시간을 단축 할 수 있어 주로 순차적인 데이터를 관리하는 테이블에 많이 사용된다.  
수평 파티셔닝이란 샤딩(Sharding)과 동일한 개념으로써 스키마(schema)를 복제한 후 샤드키를 기준으로 데이터를 나누는 것을 말한다. 즉 스키마가 같은 데이터를 두 개 이상의 테이블에 나누어 저장하는 것을 말한다. 하나의 테이블의 각 행을 다른 테이블에 분산시키는 것이다. 수평 파티셔닝은 퍼포먼스, 가용성을 위하여 key를 기반으로 여러 곳에 분산 저장한다. 그리고 일반적으로 분산 저장 기술에서 파티셔닝은 수평 분할을 의미한다. 보통 수평 분할을 한다고 하였을 때는 하나의 데이터베이스 안에서 이루어지는 경우를 지칭한다. 장점에는 데이터의 개수를 기준으로 나누어 파티셔닝 하며, 데이터의 개수가 작아지고 따라서 데이터베이스의 개수도 작아지게 된다. 자연스럽게 성능은 향상된다. 단점은 서버 간 연결 과정이 많아지고 데이터를 찾는 과정이 기존보다 복잡해 지연시간이 증가하나. 또한 하나의 서버가 고장나게 된다면 데이터의 무결성이 깨질 가능성이 있다.
 
  
* 수직(vertical) 파티셔닝
+
=== 리스트(List) 파티셔닝 ===
수직 파티셔닝이란 모든 컬럼들 중 특정 컬럼들을 쪼개어 따로 저장하는 형태를 의미한다. 스키마를 나누고 데이터가 따라 옮겨가는 것을 말하며 하나의 entity를 2개 이상으로 분리하는 작업으로 테이블의 일부 열을 빼내는 형태로 분할한다. 관계형 데이터베이스에서 3정규화와 같은 개념으로 접근하면 이해하기 쉽다. 하지만 수직 파티셔닝은 이미 정규화된 데이터를 분리하는 과정이다. 수직 파티셔닝을 사용하면 자주 사용하는 컬럼 등을 분리시켜 성능을 향상시킬 수 있다. 그리고 한 테이블을 선택하면 결국 모든 컬럼을 메모리에 올리게 되므로써 필요하지 않은 컬럼까지 올라가서 한번에 읽을 수 있는 열이 줄어든다. 이는 I/O  측면에서 본다면 필요한 컬럼만 올리면 훨씬 많은 수의 열을 메모리에 올릴 수 있으니 성능상의 이점이 있으며 같은 타입의 데이터가 저장되기 때문에 저장 시 데이터의 압축률을 높일 수 있다. <ref name="블로그"></ref>
+
리스트 파티셔닝은 특정 컬럼의 특정 값을 기준으로 파티셔닝을 하는 방식이다. 특정 파티션에 저장 될 데이터에 대한 명시적 제어가 가능하며 주로 이질적인 값이 많지 않고 분포도가 비슷하고 대소문자를 구분하는데 허용문자 외 다른 문자를 입력시 에러가 발생한다. 다양한 [[SQL]]의 액세스 패스에서 해당 컬럼의 조건이 많이 들어오는 경우에 유용하게 사용된다.
  
* Key or Hash Based Partitioning  
+
=== Key or Hash Based Partitioning ===
entity를 해쉬함수에 넣어서 나오는 값을 이용하여 서버를 정하는 방식으로 사용자의 ID가 숫자로만 이루어져 있다면 나머지 연산을 이용한다. 해시결과 데이터가 균등하게 분포되도록 해시함수를 정해야 한다. 해시함수를 바꾸는 것은 거의 불가능 하기 때문에 균등하게 나눌 수 있는 해시함수 선정이 중요하다.
+
entity를 [[해시함수]]에 넣어서 나오는 값을 이용하여 서버를 정하는 방식으로 사용자의 ID가 숫자로만 이루어져 있다면 나머지 연산을 이용한다. 해시결과 데이터가 균등하게 분포되도록 해시함수를 정해야 한다. 해시함수를 바꾸는 것은 거의 불가능 하기 때문에 균등하게 나눌 수 있는 해시함수 선정이 중요하다.
  
* Directory Based Partitioning
+
=== Directory Based Partitioning ===
파티셔닝을 제공하는 특정 서비스를 만드는 것을 의미한다. 데이터베이스와 캐시를 적정히 조합하여 만들거나 샤드키를 조절하는 방법 등 여러가지가 있다. <ref name="네이버 블로그"></ref>
+
파티셔닝을 제공하는 특정 서비스를 만드는 것을 의미한다. 데이터베이스와 [[캐시]]를 적정히 조합하여 만들거나 샤드키를 조절하는 방법 등 여러가지가 있다. <ref name="네이버 블로그"></ref>
  
 
== 분할 기준 ==
 
== 분할 기준 ==
 +
강력한 데이터베이스 관리 시스템은 분할에 대해 각종 기준을 제공한다. 분할은 [[분할키]](partitioning key)를 사용한다.
 +
 +
* '''범위 분할'''(range partitioning) : 분할 키 값이 범위 내에 있는지의 여부로 구분한다. 예를 들어, 우편 번호를 분할 키로 수평 분할하는 경우이다.
 +
 +
* '''목록 분할'''(list partitioning) : 값 목록에 파티션을 할당 분할 키 값을 그 목록에 비추어 파티션을 선택한다. 예를 들면, Country 라는 컬럼의 값이 Iceland, Norway, Sweden, Finland, Denmark 중 하나에 있는 행을 빼어낼 때 북유럽 국가 파티션 구축이 가능하다.
 +
 +
* '''해시 분할'''(hash partitioning) : [[해시함수]]의 값에 따라 파티션에 포함할지 여부를 결정한다. 예를 들면, 4개의 파티션으로 분할할 경우 해시 함수는 0~3의 정수를 돌려준다.
  
 +
* '''합성 분할'''(composite partitioning) : 상기 기술을 결합하는 것을 의미한다. 예를 들면 먼저 범위 분할을 하고, 다음에 해시 분할 같은 것을 생각한다. 컨시스턴트 해시법은 해시 분할 및 목록 분할의 합성으로 간주 될 수 있고 키 공간을 해시 축소하므로써 알람할 수 있게 한다. <ref name="블로그"></ref>
  
 
{{각주}}
 
{{각주}}
49번째 줄: 69번째 줄:
 
* 위들, 〈[https://rokking1.blog.me/221318669543 파티셔닝의 정의와 종류 그리고 샤딩]〉, 《네이버 블로그》, 2018-07-13
 
* 위들, 〈[https://rokking1.blog.me/221318669543 파티셔닝의 정의와 종류 그리고 샤딩]〉, 《네이버 블로그》, 2018-07-13
 
* 오피스넷 , 〈[https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html [DB]_DB_파티셔닝(Partitioning)이란]〉, 《블로그》, 2018-09-24
 
* 오피스넷 , 〈[https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html [DB]_DB_파티셔닝(Partitioning)이란]〉, 《블로그》, 2018-09-24
 +
* 〈[https://brocess.tistory.com/205 데이터베이스(DB) 파티셔닝이란?]〉, 《티스토리》, 2019-02-19
 +
* 남준현 기자, 〈[http://www.zdnet.co.kr/view/?no=00000039137247 (DB 성능관리 2% 채우기) ② 테이블 파티셔닝의 재발견]〉, 《ZD Net Korea》, 2008-09-11
  
 
== 같이 보기 ==
 
== 같이 보기 ==
55번째 줄: 77번째 줄:
 
* [[샤드]]
 
* [[샤드]]
  
{{블록체인 기술|토막글}}
+
{{블록체인 기술|검토 필요}}

2022년 5월 3일 (화) 15:42 기준 최신판

파티셔닝(partitioning)은 데이터베이스를 여러 부분으로 분할하는 것이다. 데이터베이스의 분할은 중요한 튜닝 기법으로 데이터가 너무 커졌을때, 조회하는 시간이 길어졌을 때 또는 관리 용이성, 성능, 가용성 등의 향상을 이유로 행해지는 것이 일반적이다. 분할된 각 부분은 '파티션'이라고 부른다. 가장 일반적인 것은 분산 데이터베이스 분할인데 각 파티션은 여러 노드에 분산 배치되어 사용자가 각 노드에서 로컬 트랜잭션을 수행 할 수 있다. 이것은 가용성과 보안을 유지하면서 특정 뷰에 관한 일반 트랜잭션의 성능을 향상시켜준다. 데이터베이스의 분할, 각각 작은 데이터베이스가 되도록 하는 분할 방법과 하나의 테이블과 같이 선택된 요소만 분리하는 방법이 있다. [1]

개요[편집]

파티셔닝에는 일반적으로 행으로 파티션을 나누는 수평 파티셔닝과 컬럼별로 파티셔닝을 나누는 수직 파티셔닝 두 가지 방법이 있다. 보통 일반적으로는 수평 파티셔닝을 사용한다. 파티셔닝은 퍼포먼스, availability, maintainability 를 목적으로 논리적인 데이터를 다수의 entity로 분할하는 행위를 말한다. 인덱스는 임의의 키 값의 따라 행 데이터 위치를 식별한다. 이 때 사용하는 기능인 파티셔닝은 테이블을 여러 개의 파티션으로 분할하여 키의 값에 따라 어떤 파티션에 속하는 행인지 배분하는 역할을 한다. [2] 대부분의 데이터베이스 관리 시스템에서 지원하지만 Mysql 5.1 미만에서는 지원하지 않는다. 샤딩 또한 이 파티셔닝의 종류 중 하나이다. [3]즉, 큰 테이블이나 데이터베이스를 관리하기 쉬운 파티션이라는 작은 단위로 물리적으로 분할하는 것을 말한다. 물리적인 데이터 분할이 있더라도, 데이터베이스에 접근하는 애플리케이션 입장에서는 이를 인식하지 못한다. [4]

등장 배경[편집]

서비스의 크기가 점점 커지고 데이터베이스에 저장하는 데이터의 규모 또한 대용량화가 되면서, 기존에 사용하는 데이터베이스 시스템의 용량의 한계와 성능의 저하를 가져오면서 초대형 데이터베이스와 같이 하나의 데이터베이스에 너무 큰 테이블이 들어가게 되면서 이러한 문제점을 해결하기 위하여 테이블을 '파티션'이라는 작은 단위로 나누어 관리하는 '파티셔닝'기법이 나타나게 된것이다. 파티셔닝 기법이 나타나면서 소프트웨어적으로 데이터베이스를 분산처리하여 성능이 저하되는 것을 방지하고 관리를 보다 수월하게 할 수 있게 되었다. [4]

목적[편집]

성능(Performance)[편집]

  • 특정 데이터 조작 언어(DML)와 쿼리(Query)의 성능을 향상시킨다.
  • 주로 대용량 데이터 Write 환경에서 효율적이다.
  • 풀스캔에서 데이터 허용의 범위를 줄여 성능을 향상시킨다.
  • 많은 테이블이 있는 온라인 트랜잭션 처리 시스템에서 테이블 작업을 작은 단위인 파티션들로 분산시켜 경합을 줄인다.

가용성(Availability)[편집]

  • 물리적인 파티셔닝으로 인하여 전체 데이터의 훼손 가능성이 줄어들고 데이터 가용성이 향상된다.
  • 테이블의 파티션 단위로 Disk I/O 를 분산하여 경합을 줄이므로 업데이트 성능을 향상시킨다.
  • 각 분할 영역으로 독립적으로 백업하고 복구할 수 있다.

관리용이성 (Manageability)[편집]

  • 큰 테이블을 제거하여 관리를 쉽게 해준다. [4]

특징[편집]

장점[편집]

Query performance 가 특정 상황에서는 아주 향상될 수 있다. 특히, 대부분 많이 접근되는 행이 하나나 몇개의 파티셔닝에 집중되어 있다면 파티셔닝 자체가 인덱스 사이즈를 줄이는 것이 가능하고, 때로는 많이 사용하는 부분을 메모리에 모두 올리는 것이 가능할 수 있기 때문이다. 필요한 데이터만 빠르게 조회가 가능하기 때문에 쿼리 자체가 가볍다. 하나의 파티션에 큰 부분을 접근하는 쿼리나 업데이트에서 성능 향상이 가능하다. 인덱스를 타거나 랜덤하게 전체의 테이블에 있는 데이터를 읽는 대신에 하나의 파티션에서 순차적인 스캔이 가능하기 때문이다. 즉 Full Scan에서 데이터 허용 범위를 줄여 성능 향상을 가져온다. 대량의 데이터를 올리거나 삭제하는 것이 파티션을 통째로 다룸으로써 가능하다. 물론 요구사항이 파티션 디자인 시에 계획이 되었을때 이다. 잘 사용하지 않는 데이터는 더 저렴하고 상대적으로 느린 저장소에 따로 저장이 가능하다. 그리고 파티션별로 백업 및 복구가 가능하며 파티션 단위로 I/O 분산이 가능하여 업데이트 성능을 향상시킨다.

단점[편집]

테이블간 JOIN에 대한 비용이 증가하고 테이블과 인덱스를 따로 파티셔닝 할 수 없다. 데이터를 입력 받았을때 어디에 넣어야 하는지에 대한 연산 오버헤드가 발생이 가능하고 인덱스만으로 해결되는 부분 파티셔닝을 적용하였을때는 오히려 성능이 나빠질 수가 있다. [2]

종류[편집]

수평(horizontal) 파티셔닝[편집]

수평 파티셔닝이란 샤딩(Sharding)과 동일한 개념으로써 스키마(schema)를 복제한 후 샤드키를 기준으로 데이터를 나누는 것을 말한다. 즉 스키마가 같은 데이터를 두 개 이상의 테이블에 나누어 저장하는 것을 말한다. 하나의 테이블의 각 행을 다른 테이블에 분산시키는 것이다. 수평 파티셔닝은 퍼포먼스, 가용성을 위하여 key를 기반으로 여러 곳에 분산 저장한다. 그리고 일반적으로 분산 저장 기술에서 파티셔닝은 수평 분할을 의미한다. 보통 수평 분할을 한다고 하였을 때는 하나의 데이터베이스 안에서 이루어지는 경우를 지칭한다. 장점에는 데이터의 개수를 기준으로 나누어 파티셔닝 하며, 데이터의 개수가 작아지고 따라서 데이터베이스의 개수도 작아지게 된다. 자연스럽게 성능은 향상된다. 단점은 서버 간 연결 과정이 많아지고 데이터를 찾는 과정이 기존보다 복잡해 지연시간이 증가하나. 또한 하나의 서버가 고장나게 된다면 데이터의 무결성이 깨질 가능성이 있다.

수직(vertical) 파티셔닝[편집]

수직 파티셔닝이란 모든 컬럼들 중 특정 컬럼들을 쪼개어 따로 저장하는 형태를 의미한다. 주로 순차적인 데이터를 관리하는 테이블에 많이 사용한다. 스키마를 나누고 데이터가 따라 옮겨가는 것을 말하며 하나의 entity를 2개 이상으로 분리하는 작업으로 테이블의 일부 열을 빼내는 형태로 분할한다. 관계형 데이터베이스에서 3정규화와 같은 개념으로 접근하면 이해하기 쉽다. 하지만 수직 파티셔닝은 이미 정규화된 데이터를 분리하는 과정이다. 수직 파티셔닝을 사용하면 자주 사용하는 컬럼 등을 분리시켜 성능을 향상시킬 수 있다. 그리고 한 테이블을 선택하면 결국 모든 컬럼을 메모리에 올리게 되므로써 필요하지 않은 컬럼까지 올라가서 한번에 읽을 수 있는 열이 줄어든다. 이는 I/O 측면에서 본다면 필요한 컬럼만 올리면 훨씬 많은 수의 열을 메모리에 올릴 수 있으니 성능상의 이점이 있으며 같은 타입의 데이터가 저장되기 때문에 저장 시 데이터의 압축률을 높일 수 있다. [4]

해시(Hash) 파티셔닝[편집]

해시 파티셔닝은 특정 컬럼 값에 해시 함수를 적용하여 분할하는 방식으로, 데이터의 관리 보다는 성능 향상에 목적을 둔다. 레인지 파티셔닝은 각 범위에 따라 데이터의 양이 일정하지 않아 분포도가 일정하지 않은 단점이 있지만, 해시 파티셔닝은 이러한 단점을 보완하여 일정한 분포도를 가진 파티션으로 나누고, 균등한 분포도를 가질 수 있도록 조율하여 병렬 프로세싱으로 성능을 높인다. 실제로 분포도를 정의하기 어려운 테이블을 파티셔닝을 할 때 많이 이용하고 2의 제곱수로 파티셔닝하는 것이 일반적이다. 해시 파티셔닝으로 구분된 파티션들은 동일한 논리, 물리적 속성을 가진다. 또한 레인지 파티션과 달리 각 파티션에 지정된 값들을 데이터베이스 관리 시스템이 결정하므로 각 파티션에 어떤 값들이 들어있는지 알 수가 없다. 하지만 대용량의 분포도가 일정치 않은 테이블을 마이그레이션 할 때는 프로그램 병렬 방식과 유용하게 쓰일 수 있다. [5]

레인지 (Range) 파티셔닝[편집]

레인지 파티셔닝은 연속적인 숫자나 날짜를 기준으로 파티셔닝 한다. 일별, 월별, 분기별 등 의 데이터에 적합하고 손 쉬운 관리 기법 제공에 따른 관리 시간을 단축 할 수 있어 주로 순차적인 데이터를 관리하는 테이블에 많이 사용된다.

리스트(List) 파티셔닝[편집]

리스트 파티셔닝은 특정 컬럼의 특정 값을 기준으로 파티셔닝을 하는 방식이다. 특정 파티션에 저장 될 데이터에 대한 명시적 제어가 가능하며 주로 이질적인 값이 많지 않고 분포도가 비슷하고 대소문자를 구분하는데 허용문자 외 다른 문자를 입력시 에러가 발생한다. 다양한 SQL의 액세스 패스에서 해당 컬럼의 조건이 많이 들어오는 경우에 유용하게 사용된다.

Key or Hash Based Partitioning[편집]

entity를 해시함수에 넣어서 나오는 값을 이용하여 서버를 정하는 방식으로 사용자의 ID가 숫자로만 이루어져 있다면 나머지 연산을 이용한다. 해시결과 데이터가 균등하게 분포되도록 해시함수를 정해야 한다. 해시함수를 바꾸는 것은 거의 불가능 하기 때문에 균등하게 나눌 수 있는 해시함수 선정이 중요하다.

Directory Based Partitioning[편집]

파티셔닝을 제공하는 특정 서비스를 만드는 것을 의미한다. 데이터베이스와 캐시를 적정히 조합하여 만들거나 샤드키를 조절하는 방법 등 여러가지가 있다. [3]

분할 기준[편집]

강력한 데이터베이스 관리 시스템은 분할에 대해 각종 기준을 제공한다. 분할은 분할키(partitioning key)를 사용한다.

  • 범위 분할(range partitioning) : 분할 키 값이 범위 내에 있는지의 여부로 구분한다. 예를 들어, 우편 번호를 분할 키로 수평 분할하는 경우이다.
  • 목록 분할(list partitioning) : 값 목록에 파티션을 할당 분할 키 값을 그 목록에 비추어 파티션을 선택한다. 예를 들면, Country 라는 컬럼의 값이 Iceland, Norway, Sweden, Finland, Denmark 중 하나에 있는 행을 빼어낼 때 북유럽 국가 파티션 구축이 가능하다.
  • 해시 분할(hash partitioning) : 해시함수의 값에 따라 파티션에 포함할지 여부를 결정한다. 예를 들면, 4개의 파티션으로 분할할 경우 해시 함수는 0~3의 정수를 돌려준다.
  • 합성 분할(composite partitioning) : 상기 기술을 결합하는 것을 의미한다. 예를 들면 먼저 범위 분할을 하고, 다음에 해시 분할 같은 것을 생각한다. 컨시스턴트 해시법은 해시 분할 및 목록 분할의 합성으로 간주 될 수 있고 키 공간을 해시 축소하므로써 알람할 수 있게 한다. [4]

각주[편집]

  1. 데이터베이스_분할〉, 《위키백과》
  2. 2.0 2.1 데이터베이스(DB) 파티셔닝이란?〉, 《티스토리》
  3. 3.0 3.1 파티셔닝의 정의와 종류 그리고 샤딩〉, 《네이버 블로그》
  4. 4.0 4.1 4.2 4.3 4.4 [DB_DB_파티셔닝(Partitioning)이란]〉, 《블로그》
  5. (DB 성능관리 2% 채우기) ② 테이블 파티셔닝의 재발견〉, 《ZD Net Korea》

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 파티셔닝 문서는 블록체인 기술에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.