생계/Oracle2026. 9. 23. 18:42
반응형

오라클 서브파티션 테스트 

 - range-list 구조의 복합파티션 관리하기

 - 템플릿을 등록하고 파티션 추가시 템플릿대로 추가되는지 확인 

 


DROP TABLE TB_TEST_CMP;

CREATE TABLE TB_TEST_CMP
(
    CLS_YM VARCHAR2(6),
    COCD1  VARCHAR2(3),
    COCD2  VARCHAR2(3),
    VAL    NUMBER
)
PARTITION BY RANGE (CLS_YM)
SUBPARTITION BY LIST (COCD1, COCD2)
SUBPARTITION TEMPLATE
(
    SUBPARTITION L100_200 VALUES ('100', '200'),
    SUBPARTITION L100_400 VALUES ('100', '400'),
    SUBPARTITION L_DEF VALUES (DEFAULT)
)
(
    PARTITION PT_202601 VALUES LESS THAN ('202602'),
    PARTITION PT_202602 VALUES LESS THAN ('202603'),
    PARTITION PT_202603 VALUES LESS THAN ('202604'),
    PARTITION PT_MAX    VALUES LESS THAN (MAXVALUE)
);

-- PT_202603 파티션에 수동으로 서브파티션 추가
ALTER TABLE TB_TEST_CMP MODIFY PARTITION PT_202603 ADD SUBPARTITION L500_600 VALUES ('500', '600');
--> SQL Error [14621] [72000]: ORA-14621: DEFAULT 하위 분할 영역이 존재하는 경우 하위 분할 영역을 추가할 수 없음

 
-- 디폴트 서브파티션을 쪼개는 방식으로 추가 
ALTER TABLE TB_TEST_CMP SPLIT SUBPARTITION PT_202603_L_DEF INTO
(
    SUBPARTITION PT_202603_L500_600 VALUES ('500', '600'),
    SUBPARTITION PT_202603_L700_800 VALUES ('700', '800'),
    SUBPARTITION PT_202603_L_DEF   
);

서브파티션이 변경이 되었으니 새로 템플릿을 지정하자

-- 템플릿 재지정 
ALTER TABLE TB_TEST_CMP SET SUBPARTITION TEMPLATE();

ALTER TABLE TB_TEST_CMP SET SUBPARTITION TEMPLATE
(
    SUBPARTITION L100_200 VALUES ('100', '200'),
    SUBPARTITION L100_400 VALUES ('100', '400'),
    SUBPARTITION L500_600 VALUES ('500', '600'),  -- 새로 추가된 서브파티션 1
    SUBPARTITION L700_800 VALUES ('700', '800'),  -- 새로 추가된 서브파티션 2
    SUBPARTITION L_DEF    VALUES (DEFAULT)
);

-- 템플릿 확인 
SELECT *
  FROM DBA_SUBPARTITION_TEMPLATES
 WHERE table_name ='TB_TEST_CMP'
;



-- PT_MAX 파티션을 SPLIT 하여 PT_202604 생성
ALTER TABLE TB_TEST_CMP SPLIT PARTITION PT_MAX AT ('202605')
INTO (PARTITION PT_202604, PARTITION PT_MAX);

-- maxvalue 파티션을 분할하는 경우 maxvalue 파티션 구조를 따라와서 템플릿과 다르게 생성됨 
SELECT table_owner, table_name, partition_name, composite, subpartition_count, high_value
FROM DBA_TAB_PARTITIONS
WHERE TABLE_NAME = 'TB_TEST_CMP'
;



-- 서브파티션 생성 결과 확인
SELECT PARTITION_NAME, SUBPARTITION_NAME, HIGH_VALUE, subpartition_position
FROM DBA_TAB_SUBPARTITIONS
WHERE TABLE_NAME = 'TB_TEST_CMP'
ORDER BY PARTITION_NAME, SUBPARTITION_NAME;



-- maxvalue 파티션 제거하고 add partition 

SELECT * FROM TB_TEST_CMP partition(PT_MAX);

ALTER TABLE TB_TEST_CMP DROP PARTITION PT_202604;
ALTER TABLE TB_TEST_CMP DROP PARTITION PT_MAX;


ALTER TABLE TB_TEST_CMP ADD 
    PARTITION PT_202604 VALUES LESS THAN ('202605'),
    PARTITION PT_202605 VALUES LESS THAN ('202606'),
    PARTITION PT_202606 VALUES LESS THAN ('202607'),
    PARTITION PT_MAX    VALUES LESS THAN (MAXVALUE)
;

-- add partition 은 템플릿대로 생성이 됨.
SELECT table_owner, table_name, partition_name, composite, subpartition_count, high_value
FROM DBA_TAB_PARTITIONS
WHERE TABLE_NAME = 'TB_TEST_CMP'
;

 

 - maxvalue 파티션이 있는경우 split 방식으로 파티션이 추가됨. 템플릿이 아닌 split 대상과 구조가 동일

 - default 서브파티션이 있는경우 서브파티션추가는 default 를 분할하는 방식으로 추가됨. 

 - 템플릿으로 추가시 서브파티션 명은 "파티션명_"+"템플릿의서브파티션명" 으로 지정됨. 

반응형
Posted by 돌고래트레이너