본문 바로가기

데이터 사이언스 DataScience/Data Base 데이터베이스

[Oracle] 가상컬럼을 통한 파티션 테이블 관리

파티션이 아닌 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')
)
;

 

 

 

참고자료 : 

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/vldbg/evolve-nopartition-table.html#GUID-5C0F8D12-DDDF-42AB-B644-1880156832BC

 

 

반응형