by axiom Multi-Column Range Partition PARTITION 파티션 [2014.06.23]
데이터가 점점 대용량화되는 시대에 파티션 테이블은 더 이상 낯설지 않은 기능이 됐다. 현재 파티션 테이블은 이력관리나 DW(Data Warehouse), 실시간 Insert 시 블록경합 방지 등 여러 목적으로 사용되고 있다.
오라클 파티션 테이블 기능은 오라클 8 버전에서 소개됐고 Range, Hash, List 세 종류의 파티션 테이블이 사용되고 있다. 또한 오라클 11g에서는 Interval, Reference, Virtual column-based 파티션 테이블 등 새로운 기능이 지원되면서 점점 발전 및 확장되고 있다.
이렇게 다양한 파티션 테이블 기능 중에서도 과거부터 현재까지 가장 많이 사용되는 파티션 테이블 기법은 Range 파티션이다. 가장 많이 사용되는 만큼 가장 많이 실수하는 파티션이기도 하다.
이 글에서는 가장 빈번하게 실수하는 Range 파티션 사례에 대해 설명하고자 한다. 다음은 Range 파티션 중에서도 다중 컬럼을 파티션 키로 지정하는 Multi-Column Range 파티션의 내용이다.
[리스트 1]은 Range 파티션에 파티션 키가 2개의 컬럼을 생성하는 스크립트다.
CREATE TABLE M_PART_TABLE ( CODE VARCHAR2(6), CDATE VARCHAR2(8) ) PARTITION BY RANGE ( CODE, CDATE ) ( PARTITION P01_201209 VALUES LESS THAN ('10001', '20120932’), PARTITION P01_201210 VALUES LESS THAN ('10001', '20121032’), PARTITION P02_201209 VALUES LESS THAN ('20001', '20120932'), PARTITION P02_201210 VALUES LESS THAN ('20001', '20121032') )
코드별, 일자별로 데이터를 저장하고자 하는 파티션 테이블이다. 파티션을 만들고 데이터가 저장되면 각 파티션별로 비슷한 분포를 보이며 데이터가 저장될 것으로 예상하며, 파티션 키를 정해 사용한다.
[리스트 2]의 M_PART_TABLE 파티션 테이블에서 데이터 분포를 확인해 보자.
PARTITION_NAME NUM_ROWS ------------------------------ --------- P01_201209 6 P01_201210 2 P02_201209 6 P02_201210 2
예상과 달리 분포도가 동일하지 않다. Insert 값과 해당 파티션 데이터를 확인해 어느 파티션에 어느 데이터가 들어갔는지 살펴보자.
INSERT INTO M_PART_TABLE VALUES ('00001' , '20120901'); INSERT INTO M_PART_TABLE VALUES ('00001' , '20120902'); INSERT INTO M_PART_TABLE VALUES ('00001' , '20121001'); INSERT INTO M_PART_TABLE VALUES ('00001' , '20121002'); INSERT INTO M_PART_TABLE VALUES ('10001' , '20120901'); INSERT INTO M_PART_TABLE VALUES ('10001' , '20120902'); INSERT INTO M_PART_TABLE VALUES ('10001' , '20121001'); INSERT INTO M_PART_TABLE VALUES ('10001' , '20121002'); INSERT INTO M_PART_TABLE VALUES ('10002' , '20120901'); INSERT INTO M_PART_TABLE VALUES ('10002' , '20120902'); INSERT INTO M_PART_TABLE VALUES ('10002' , '20121001'); INSERT INTO M_PART_TABLE VALUES ('10002' , '20121002');...
[리스트 3]의 파티션에서 값을 보면 각 월에 해당되는 데이터가 아닌 다른 달의 데이터가 확인된다. Multi-column Range 파티션 생성 시 다음 두 가지를 고려해야 한다.
[리스트 3]의 예제에서 10월 데이터가 9월 파티션에 저장된 것은 첫 번째 키 값의 범위인 ‘10001’ 범위에 속한 까닭에 두 번째 키 값의 범위가 고려되지 않았기 때문이다.
필자는 이러한 사항이 간과돼 파티션의 분포도가 특정 파티션에 치우치는 경우를 종종 경험했다. 또한 사이트에선 이런 사실조차 모르고 있는 경우가 대부분이었다. 그러면 이에 대한 해결책은 무엇일까?
예제에서 파티션 정책의 가장 큰 오류는 2개의 기준으로 범위를 나누려 했다는 데 있다. 이에 다음과 같은 두 가지를 생각해볼 수 있다.
첫 번째는 하나의 파티션 키로 변경이다. 어차피 2개의 범위 기준은 비슷한 분포도 저장도 어렵고 정확한 구분도 안 된다. 그렇기 때문에 파티션의 기준을 명확히 해서 하나의 파티션 키로 변경한다면 파티션에 저장된 데이터 예측이 가능하고 분포도도 균일할 것이다.
두 번째는 결합(Composite) 파티션 구성이다. 2개의 기준을 충족하기 위해 Range 파티션 + Range 파티션을 구성한다. 단 이 기능은 오라클 11g부터 가능하다.
CREATE TABLE C_RR_PART_TABLE ( CODE VARCHAR2(6), CDATE VARCHAR2(8) ) PARTITION BY RANGE (CODE) SUBPARTITION BY RANGE(CDATE) ( PARTITION P_00 VALUES LESS THAN ('10001') ( SUBPARTITION PS_201209_00 VALUES LESS THAN('20120932'), SUBPARTITION PS_201210_00 VALUES LESS THAN('20121032') ), PARTITION P_01 VALUES LESS THAN ('20001') ( SUBPARTITION PS_201209_01 VALUES LESS THAN('20120932'), SUBPARTITION PS_201210_01 VALUES LESS THAN('20121032') ), PARTITION P_02 VALUES LESS THAN ('30001') ( SUBPARTITION PS_201209_02 VALUES LESS THAN('20120932'), SUBPARTITION PS_201210_02 VALUES LESS THAN('20121032') ) )
[리스트 4]와 같이 명확한 기준으로 구분할 수 있다. 그러나 이와 같은 결합 파티션 구성으로 파티션 개수가 늘어났으며, 이는 조회 성능을 떨어뜨리므로 이점을 고려해 적용해야 한다.
따라서 Multi-Column Range 파티션 사용을 고려한다면 기준을 명확히 해서 사용하고 파티션 구성 시에 많은 점을 고려해야 한다는 것을 기억하자.
이 글을 보고 내가 사용하는 DB에 Multi-Column Range 파티션이 있는지 확인해 보고 데이터 분포도를 확인하자. 또한 의도한 대로 데이터가 해당 파티션에 저장되고 있는지도 확인할 필요가 있다.
- 강좌 URL : http://www.gurubee.net/lecture/2769
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.