오늘은 파티셔닝에 대해서 포스팅 해보도록 하겠습니다. 실제로 파티셔닝으로 테이블을 설계해 보지 않아서 대략적인 의미만 알고 있었기에 한 번 정리할겸 책에서 학습한 내용을 정리해 봅니다. 해당 내용은 '관계형 데이터베이스 실전 입문'을 참고하였습니다.
파티셔닝(Partitioning)이란?
파티셔닝에는 일반적으로 수평 파티셔닝(행으로 파티션을 나누는 방식)과 수직 파티셔닝(컬럼별로 파티셔닝을 나누는 방법, 특정 컬럼만을 고속 스캔할 때 유용) 두 가지 방법이 있다. 보통 일반적으로 수평 파티셔닝(행으로 파티션을 나누는) 방식을 대부분 사용하고 해당 포스팅에서도 수평 파티셔닝에 대해서만 정리하도록 하겠습니다.
인덱스는 임의의 키 값에 따라서 행 데이터의 위치를 식별하는데 사용하는 기능인 반면 파티셔닝은 테이블을 여러 개의 파티션으로 분할하고 키의 값에 따라 어떤 파티션에 속하는 행인지 배분하는 역할을 합니다.
파티션은 각각 같은 구조(schema)를 가진 테이블이며 인덱스도 파티션마다 존재합니다.
출처 : 관계형 데이터베이스 실전 입문
위의 그림에서는 세 개의 파티션이 정의되어 있고 날짜에 따라 저장될 파티션이 나뉘게 됩니다. 어떤 파티션에 속할 것인지 정하는 키(파티션 키)를 검색 조건으로 지정하면 해당 파티션만 검색하면 되므로 검색 효율이 향상됩니다.
위의 그림에서 검색조건이 '2014-04-01'이므로 p3 파티션에 원하는 행이 있다는 사실을 알 수 있습니다. 이처럼 검색 대상 파티션을 좁혀가는 동작을 파티션 프루닝(Partition Pruning)이라고 합니다. -> Pruning은 가지치기란 뜻입니다.
파티셔닝이 적합한 경우
파티셔닝을 사용할지의 가장 큰 판단 기준은 파티션 프루닝을 할 수 있는 검색 조건을 포함한 쿼리의 실행빈도입니다. 파티션 프루닝이 유효한 쿼리가 대부분일 때는 파티셔닝에 의한 처리 전체의 효율화가 기대됩니다. (일반적으로 날짜를 기준으로 최신 데이터를 항상 참조할 경우)
그러나 파티셔닝이 적합하다고 판단될 때도 인덱스를 붙이는 것만으로 충분할 때가 대부분입니다. 파티셔닝을 사용하는 이유는 단일 INSERT나 혹은 단일 Select, 범위 Select의 아주 빠른 처리가 필요할 경우 혹은 이력 데이터의 효율적인 관리가 필요한 경우 입니다. (불필요해진 데이터를 백업 & 삭제하는 작업이 상당히 고부하 작업이기 때문)
추가로 새로운 데이터를 차례로 추가하는 응용프로그램이며 과거의 데이터에 그다지 접근하지 않을 때는 레인지 파티셔닝을 수행해 엑세스되는 대상의 데이터 국소성을 최대한 활용할 수 있다. 파티셔닝을 사용하면 파티셔닝별로 인덱스가 작성되기 때문이다. 최신 데이터가 항상 검색 대상이라면 p3(그림)만 엑세스 대상이 될 것이고 엑세스의 국소성이 있다면 캐시의 효율이 매우 향상된다. 따라서 대부분 검색이 메모리만으로 처리되고 디스크 I/O를 줄여서 성능 향상을 실현 할 수 있다.
파티셔닝의 단점
데이터를 입력받았을 경우 어디에 넣어야 하는지에 대한 연산 오버헤드가 발생
할 수 있고 인덱스만으로도 해결되는 부분 파티셔닝을 무분별하게 파티셔닝을 적용했을 때는 오히려 성능이 나빠질 수 있음에 유의.
결론
파티셔닝을 적용할 때는 적용하지 않았을 때와 비교해 확실한 성능의 이점이 생기는지 꼭 확인해보자!!!!