파티션이 아닌 nonpartitioned 테이블을 파티션화할때 가장 먼저 고려해볼만한 것은
online redefinition이다.
현재 PK에 파티션 기준 컬럼이 포함되어있다면
아래 PROCEDURE를 통해 ONLINE REDEFINITION을 진행하면 된다.
DBMS_REDEFINITION.START_REDEF_TABLE(
uname => 'STEVE',
orig_table => 'salestable',
int_table => 'int_salestable1, int_salestable2, int_salestable3',
col_mapping => NULL,
options_flag => DBMS_REDEFINITION.CONS_USE_ROWID,
part_name => 'sal03q1,sal03q2,sal03q3',
continue_after_errors => TRUE);
https://docs.oracle.com/database/121/ARPLS/d_redefi.htm#ARPLS67531
그러나, 파티션 기준 컬럼이 PK에 포함되어있지 않다면
아래 2가지 방법 중 1개를 선택할 수 있다.
1) 파티션 기준 컬럼을 테이블 PK에 추가
2) 가상컬럼을 통한 테이블 파티셔닝
그런데 1)의 경우 기존 사용하던 SQL을 모두 수정해야하는 단점이 있다.
그 SQL의 규모가 크고, CDC 연동 등 기타 테이블 PK 변경으로 인한 OVERHEAD가 크다고 판단되면
2) 가상컬럼을 통한 테이블 파티셔닝을 고려해볼 수 있다.
예를 들어, 테이블의 PK에 VARCHAR2(8)로 구성된 REG_DT(등록일자) 날짜 컬럼이 있는데
보관주기 1개월 TRUNCATE를 통한 효율화를 하고 싶어
순환구조를 갖는 LIST 파티션을 적용하고 싶을때 사용할 수 있다.
PK에 포함되어야하는 실제 컬럼과 달리
테이블 가장 마지막에 추가되어도 되는 장점이 있다.
단, 가상 컬럼 추가시에도 INSERT 등 SQL을 수정해야한다.
<가상컬럼을 이용한 LIST 파티션 테이블 생성 SCRIPT 예시>
CREATE TABLE SCHEMA.TABLE (
REG_DT VARCHAR2(8),
ID VARCHAR2(20),
NAME VARCHAR2(20),
REG_DT_PT_ID VARCHAR(8) GENERATED ALWAYS AS (SUBSTR(REG_DT, 7, 2)) VIRTUAL
)
PARTITION BY (REG_DT_PT_ID)
(
PARTITION PT_L01 VALUES ('01'),
PARTITION PT_L02 VALUES ('02'),
PARTITION PT_L03 VALUES ('03'),
...
PARTITION PT_L31 VALUES ('31')
)
;
참고자료 :
반응형
'데이터 사이언스 DataScience > Data Base 데이터베이스' 카테고리의 다른 글
[Oracle] rename을 통한 테이블 마이그레이션 (0) | 2022.01.19 |
---|---|
[Oracle] OGG Classic 모드 테이블 변경시 가동 순서 (0) | 2022.01.19 |
[Oracle] 온라인 인덱스 작업이 불가능한 상황 (0) | 2022.01.10 |
[Oracle] 튜닝 최후의 수단 PROFILE (0) | 2022.01.09 |
[Oracle] OGG 오류 무시하는 방법, 특정 데이터만 동기화하는 방법 (0) | 2021.12.22 |