본문 바로가기

IT관련

오라클 파티션 - Partition Key 로 여러 컬럼을 사용하는 경우

Oracle Range, Hash 파티션의 경우, 파티션키 컬럼을 여러개의 컬럼으로 구성할 수 있습니다.

 

아래는 Range 파티션 샘플 ...

 


create table SALES (
  sales_no       number,
  sale_year      number,
  sale_month     number,
  sale_day       number,
  customer_name  varchar2(30),
  birth_date     date,
  price          number
)
partition by range (sale_year, sale_month, sale_day) 
(
  partition SALES_P1 values less than (2005, 01, 01),
  partition SALES_P2 values less than (2006, 01, 01),
  partition SALES_P3 values less than (2007, 02, 02)
);

 

sale_year, sale_month, sale_day  3개의 컬럼을 합쳐서 파티션키로 사용하였습니다.

 

 

아래는 Hash 파티션 샘플 ...

 


create table SALES (
  sales_no       number,
  sale_year      number,
  sale_month     number,
  sale_day       number,
  customer_name  varchar2(30),
  birth_date     date,
  price          number,
  state          varchar2(2)
)
partition by hash (birth_date, customer_name) 
partitions 4;

 

birth_date 와 customer_name 컬럼을 합쳐서 Hash 파티션의 파티션키로 사용하였습니다.

 

 

Hash 파티션의 경우, 해쉬함수에 의해 알아서 데이타가 들어가기 때문에, 어떤 데이터가 어느 파티션에 들어갈지에 대해일반적으로 관심이 없습니다.

하지만, Range 파티션의 경우는 관심이 가죠.

 

 

Range 파티션에서 파티션범위가 less than 으로 되어 있기 때문에, 원래 작은 값만 들어올 수 있고, 값이 같은 경우는 해당 파티션으로 들어갈 수 없었습니다.

하지만, 파티션키 컬럼이 여러개인 경우는 먼저 첫번째 컬럼을 비교해서 값이 크면 당연히 못들어가겠지만, 같은 경우는 다음 컬럼을 비교합니다.

위에서는

      첫번째로 2007 을 비교하고 SALES_P3 파티션의 조건값과 같기 때문에,

      두번째 값인 02 를 비교하고 이것도 같으니까

      세번째 값인 01 를 비교해서 작으니까 해당 파티션으로 데이타가 Insert 될 수 있었습니다.

 

세번째 값이 만약 02 였다면 값이 조건값과 같아지기 때문에 ORA-14400 에러가 발생합니다.

 

 

▶ 오라클 파티션 종합 페이지 바로가기