오라클 인터벌 파티셔닝 (Interval Partitioning)
Range 파티션 테이블을 사용할 때는 항상 HIGH VALUE를 초과하는 값이 들어오기 전에 파티션을 추가해 주어야 한다.
파티셔닝의 장점도 많지만, 위와 같은 구성은 DBA 입장에서 번거로운 관리 포인트가 하나 더 생기는 결과를 초래한다.
파티션 추가하는 것을 잊고 있다가 INSERT 실패로 장애를 맞는 불상사를 막기 위해 별도의 모니터링 등을 수행하기도 한다.
기존에는 이런 경우를 대비해서 별도의 파티션 테이블 모니터링을 한다던가, MAXVALUE까지의 값을 수용할 수 있는 안전용 파티션을 추가하는 방법을 썼으나, 오라클 11g 버전부터는 인터벌 파티셔닝이라는 기특한 기능이 지원된다.
인터벌 파티셔닝은 새로운 값이 INSERT 될 때 저장할 파티션이 없다면, 사전 정의한 규칙에 따라서 자동으로 파티션을 만들어 주는 기능이다.
인터벌 파티션 테이블은 아래와 같이 테이블 정의시 INTERVAL 키워드를 사용하여 정의한다.
CREATE TABLE INTERVAL_PARTITION_TEST (seq number, reg_ymdt date) PARTITION BY RANGE (reg_ymdt) INTERVAL ( NUMTOYMINTERVAL(1, 'MONTH') )
(
PARTITION P201501 VALUES LESS THAN (TO_DATE(' 2015-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION P201502 VALUES LESS THAN (TO_DATE(' 2015-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION P201503 VALUES LESS THAN (TO_DATE(' 2015-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ); |
기존 생성된 파티션 테이블에 인터벌을 적용, 혹은 그 반대의 경우도 가능하다.
ALTER TABLE INTERVAL_PARTITION_TEST SET INTERVAL ( NUMTOYMINTERVAL(1, 'MONTH') ) ; ALTER TABLE INTERVAL_PARTITION_TEST SET INTERVAL ( ) ;
|
위 테이블에 "2015년 4월 10일로 값으로 INSERT가 된 상황을 가정해 보면, 기존에는 저장할 파티션이 정의되지 않았으므로 ORA-14400 에러가 발생할 것이다.
(ORA-14400: inserted partition key does not map to any partition)
하지만, 위 예제에서는 인터벌 파티셔닝을 적용했기 때문에, 신규 생성되는 레코드를 자동 생성된 파티션으로 저장이 된다.
INSERT 처리 후 파티션 목록을 조회해 보면 자동으로 파티션이 생성된 것을 확인할 수 있다.
SELECT TABLE_NAME, PARTITION_NAME, INTERVAL, HIGH_VALUE FROM DBA_TAB_PARTITIONS
WHERE TABLE_NAME = 'INTERVAL_PARTITION_TEST' ORDER BY TABLE_NAME, PARTITION_NAME; TABLE_NAME PARTITION_NAME INT HIGH_VALUE --------------------------- ----------------- --- -------------------------------------------------------------------------------------- INTERVAL_PARTITION_TEST P201501 NO TO_DATE(' 2015-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') INTERVAL_PARTITION_TEST P201502 NO TO_DATE(' 2015-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') INTERVAL_PARTITION_TEST P201503 NO TO_DATE(' 2015-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') INTERVAL_PARTITION_TEST SYS_P44 YES TO_DATE(' 2015-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') |
하지만 인터벌 파티셔닝이 마냥 좋은 것만은 아니다.
파티셔닝 키가 DATE 혹은 NUMBER 이어야 된다던가, IOT 구조 혹은 도메인 인덱스를 사용하지 못하는 등의 소소한 제약사항도 따라오게 된다.
그리고 파티션 이름에 별도의 규칙을 적용한다던가, 파티션 별로 테이블 스페이스 배치를 다르게 하는 등 복잡한 구성도 불가능 하다.
세부적인 제어를 포기하고 관리 포인트를 줄일 것인지, 혹은 그 반대의 선택을 할 것인지는 각자의 판단에 따르면 될 듯.