Oracle Reference Partitioning 은 테이블의 부모-자식 (Parent-Child) 관계를 이용해서 파티셔닝하는 기법입니다.
부모테이블의 파티셔닝 방식을 마치 상속받듯이 자식테이블이 그대로 따라가는 방식입니다.
따라서, 자식테이블에는 부모테이블의 파티셔닝 속성을 따라간다는 명시만 한줄 적어주면 됩니다.
파티셔닝 방식이나, 파티셔닝 키를 어떻게 구성할 지 고민하지 않아도 되죠.
-- 부모 테이블
create table CUSTOMERS (
customer_id number,
customer_name varchar2(30),
birth_date date,
constraint CUSTOMERS_PK primary key (customer_id)
)
partition by range (birth_date)
(
partition CUSTOMERS_P1 values less than (to_date('1975/01/01','yyyy/mm/dd')),
partition CUSTOMERS_P2 values less than (to_date('1978/01/01','yyyy/mm/dd')),
partition CUSTOMERS_P3 values less than (maxvalue)
);
-- 자식 테이블
create table SALES (
sales_no number,
sale_year number,
sale_month number,
sale_day number,
customer_id number not null, -- not null 중요!!
price number,
constraint SALES_FK foreign key (customer_id) references CUSTOMERS (customer_id)
)
partition by reference (SALES_FK);
위 샘플은 CUSTOMERS 를 부모테이블로, SALES 를 자식테이블로 하고 있고, customer_id 컬럼으로 서로 Foreign Key 연결이 되어 있습니다.
파티션 구성정보는 부모테이블인 CUSTOMERS 에만 세팅되어 있고, 자식테이블인 SALES 에서는 partion by reference 키워드를 명시함으로써 부모테이블의 파티션정보를 따른다고 기술했습니다.
여기서 주의할 점이 자식테이블의 Foregin Key 에 해당하는 customer_id 컬럼에 not null 을 반드시 해줘야 하는 것입니다. 안그러면 아래와 같이 ORA-14652 에러가 발생합니다.
customer_id 컬럼을 매개로 부모테이블의 파티션구성을 참조하는데, 이게 null 값이 들어와버리면 데이터를 어떤 파티션에 집어넣어야 할지 애매해 지겠죠? 그러니 반드시 not null 속성이 필요한 겁니다.
테이블이 만들어지면 아래와 같은 구성이 됩니다.
SALES 테이블의 파티션구성이 부모테이블인 CUSTOMERS 와 똑같음을 알 수 있습니다. 심지어는 파티션명까지 똑같네요.
SALES 테이블의 HIGH_VALUE 는 어차피 부모테이블을 따라가기 때문에 기록되어 있지 않습니다.
파티션 Type 정보를 조회해보면, SALES 테이블은 REFERENCE 라고 되어 있는것을 확인할 수 있습니다.
만들어진 두 테이블에 다음과같이 데이터를 입력해 봅니다.
insert into CUSTOMERS values (101, 'Sophia', to_date('19740502','yyyymmdd'));
insert into CUSTOMERS values (102, 'Emily', to_date('19750302','yyyymmdd'));
insert into CUSTOMERS values (103, 'Olivia', to_date('19760802','yyyymmdd'));
insert into CUSTOMERS values (104, 'Amelia', to_date('19770202','yyyymmdd'));
insert into CUSTOMERS values (105, 'Chloe', to_date('19780402','yyyymmdd'));
insert into SALES values (1, 2004, 05, 02, 101, 65000);
insert into SALES values (2, 2005, 03, 02, 102, 23000);
insert into SALES values (3, 2006, 08, 02, 103, 34000);
insert into SALES values (4, 2007, 02, 02, 104, 12000);
insert into SALES values (5, 2008, 04, 02, 105, 55000);
다음과 같이 3개의 파티션에 데이터가 나뉘어 들어가는 것을 확인할 수 있습니다.
Reference 파티션은 단순히 파티션 관리차원의 편리함만을 위한 기능은 아닙니다.
파티션테이블을 사용하는 두번째 중요한 이유인 Pruning 에의한 성능상의 이점을 얻기 위한 목적도 있습니다.
부모-자식관계가 있는 테이블들은 주로 Join 에 의해 동시에 조회되는 경우가 많고, 이때 부모테이블이나 자식테이블 어느 한쪽에서 Pruning 이 발생하면 다른쪽도 자동으로 같이 Pruning 되기 때문에 빠른 실행이 가능합니다.
'IT관련' 카테고리의 다른 글
오라클 복합파티션(Composite Partition) List + Hash 샘플 (11g ~ ) (0) | 2019.06.29 |
---|---|
오라클 파티션 - Partition Key 로 여러 컬럼을 사용하는 경우 (0) | 2019.06.29 |
오라클 파티션 Auto List Partitioning 기능 사용 방법 (자동 리스트 파티셔닝) (0) | 2019.06.29 |
오라클 파티션 Auto Interval Partitioning 기능 사용 방법 (0) | 2019.06.28 |
오라클 utl_file.get_line() 한글 텍스트 제대로 못 읽는 경우 - 한글깨짐, 캐릭터셋 문제 (0) | 2019.06.28 |