서론
데이터베이스 A 테이블의 데이터가 너무 많아서 Full-Scan시 시간이 너무 많이 소요된다고 하자.
개선하는 방법 중 하나가 A 테이블을 파티션 테이블로 만드는 것이다.
파티션 테이블은 논리적으로 하나이지만, 물리적으로는 여러 개의 파티션으로 나뉘어서 데이터들이 각각의 세그먼트에 저장되는 테이블을 의미한다.
또한 파티션 테이블은 위 특징을 잘 살리는 Pruning이라는 기능이 있어서 특정 데이터를 조회를 할 때 그 데이터가 속해있는 세그먼트만 빠르게 조회할 수 있는 기능이 있다.
파티션 테이블은 위에서 설명한 것처럼 논리적으로는 하나이기에 조회 쿼리문을 특별하게 지정해 줄 필요는 없지만, 데이터들이 물리적으로 다른 세그먼트에 저장되게 개발과 관리 양면으로 장점이 많다.
파티셔닝 테이블 장점
- 조회 쿼리 성능이 향상될 수 있다.
- 디스크 장애시 해당 파티션만 영향권이므로 데이터 훼손 가능성이 감소하며, 가용성이 향상
- 개별 파티션 단위의 관리가 가능하다.
- 논리적으로는 하나의 테이블이기에 쿼리문 별도 변경 필요 없음
- 조인시에 파티션간의 또는 파티션 내의 병렬 처리를 수행
- 데이터 엑세스 범위를 줄여서 성능을 향상하고, 테이블의 파티션 단위로 디스크 I/O를 분산해 부하를 감소시킬 수 있다.
파티셔닝 테이블 단점
- 파티션 키 값 변경으로 별도 관리가 필요하다.
- 파티션에 기준이 되는 것이 컬럼의 일부일 때 일부를 기준으로 파티션을 구성하긴 어려움으로 이에 해당하는 오버헤드 컬럼이 있어야 한다.
- 예를 들어, 날짜 컬럼의 일부만을 기준으로 파티션을 나눌 경우 특정 날짜 범위를 정확하게 선택하는 쿼리 작성이 어려울 수 있다.
- 데이터를 입력받았을 때 연산 오버헤드가 발생해서 테이블에 Insert 되는 속도가 느려짐
- Join에 대한 비용이 증가한다.
파티션 테이블이 적합한 테이블
위와 같이 파티션 테이블은 트레이드 오프를 가지고 있다. 그렇기에 데이터의 양이 많고, INSERT가 지속적으로 일어나는 테이블만 파티션 테이블로 지정하는 것이 좋다.
또는 일부 데이터가 손상되더라도 나머지 데이터 사용이 가능해야 하는 테이블이나 db 장애시 복구를 최대한 빨리해야 하는 테이블에 적합하다.
파티션 키
파티션 키 컬럼은 가장 많이 사용하는 Range Partition Table에서 물리적으로 테이블이 나뉘는 기준이 되는 컬럼으로 데이터가 어느 세그먼트에 들어가야하는지 직관적으로 보이는 월이나 연이 있는 날짜 컬럼으로 많이 지정한다.
Range Partition에서 Load Balancing은 파티션 키에 의존하므로 파티션 키 선정시 이를 중요하게 고려해야한다.
- Primary Key와 같이 데이터들의 구분이 지어지지 않는 컬럼은 X
- 데이터들이 어디에 들어가 있는지 직관적으로 판단이 가능한 컬럼
- I/O 병목을 줄일 수 있는 데이터 분포도가 양호한 컬럼
Range Partitioning
- 일, 월, 분기 등 특정 컬럼의 정렬 값을 기준으로 분할하는 방식으로 논리적인 범위의 분산에 효율적이다.
- 관리가 용이하며 이력 데이터에 적합하다.
- 파티션을 결정하는 컬럼을 명시하여야 하며 MAXVALUE 값은 NULL 값을 포함한다.
- 범위가 포함하는 데이터의 양이 일정하지 않은 경우 특정 파티션에 대해서 데이터가 편중될 수 있다.