Hash Partition 은 해시함수에 의해 자동으로 파티션 갯수만큼 데이터가 분할되는 파티션 테이블 입니다.
해시 파티션키로 사용할 수 있는 컬럼은 아무 타입이나 가능합니다. 숫자, 문자, 날짜 타입 모두 다 가능합니다.
Range 나 List 파티션과 달리 Hash 파티션의 경우에는 내 데이터가 어느 파티션으로 들어갈 지 알 수 없기 때문에,
전혀 관리 목적에는 맞지 않습니다. (특정 파티션에 대해서만 특정 작업을 하는 ... )
Hash 파티션을 사용하는 이유는 데이터를 여러 위치에 분산배치해서 Disk I/O 성능을 개선하기 위함입니다.
스토리지의 특정 위치에 I/O 가 몰리는 현상을 핫블럭(Hot Block) 현상이라고 하는데, 이때 Reverse Index 와 함께 Hash Partition 이 해결책이 될 수 있습니다.
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)
partitions 4;
위는 birth_date 컬럼을 파티션키로 사용해서 4개의 해시파티션을 만드는 샘플입니다.
위 예에서는 파티션명을 지정하지 않았기 때문에, 파티션명은 DBMS가 알아서 정합니다.
이제 만들어진 파티션에 데이터를 넣어 보겠습니다.
insert into SALES values (1, 2004, 05, 02, 'Sophia', to_date('19740502','yyyymmdd'), 65000, 'WA');
insert into SALES values (2, 2005, 03, 02, 'Emily', to_date('19750302','yyyymmdd'), 23000, 'OR');
insert into SALES values (3, 2006, 08, 02, 'Olivia', to_date('19760802','yyyymmdd'), 34000, 'TX');
insert into SALES values (4, 2007, 02, 02, 'Amelia', to_date('19770202','yyyymmdd'), 12000, 'CA');
insert into SALES values (5, 2008, 04, 02, 'Chloe', to_date('19780402','yyyymmdd'), 55000, 'FL');
파티션 테이블은 내부적으로 파티션으로 분할되어져서 저장되는 것일뿐, 논리적으로는 테이블과 똑같은 특성을 가집니다. 따라서 조회하는 방식은 일반 테이블 조회하는 것과 정확히 똑같습니다.
하지만, 특정 파티션에 있는 데이터만 조회하고 싶은 경우가 있겠죠?
그때는 아래와 같이 partition 키워드를 테이블 뒤에 붙여주고, 파티션 이름을 넣어주면 됩니다.
select * from 테이블명 partition ( 파티션명 );
SALES 테이블에 입력한 5개의 데이터가 4개의 파티션으로 분산되어 잘 들어간 것을 확인할 수 있습니다.
하지만, 반드시 이렇게 잘 분산되어 들어가는 것을 보장하지는 않습니다. 어디까지나 해시함수에 의해서 수학적 계산으로 분산시키는 것이기 때문에 때로는 언밸런스 해질수도 있습니다.
실제로 birth_date 컬럼 대신에 다른 컬럼을 파티션키로 잡아서 테이블을 다시 만들어보면 언밸런스 해지는 경우를 확인할 수 있습니다.
하지만, 지금은 데이터가 적어서 그렇고 많아지면 어느정도 밸런스가 맞춰집니다.
해시파티션이 밸런스하게(파티션당 데이터건수가 비슷하게) 생성되는 것이 우리가 원하는 것이죠.
그래야 I/O 분산이 가능해져서 성능을 개선할 수 있기 때문입니다.
데이터가 많아져도 언밸런스 해지는 경우도 있습니다.
파티션키로 사용하는 컬럼의 데이터가 같은 값(중복데이터)이 너무 많은 경우 이런 현상이 있을 수 있습니다.
따라서 파티션키 선정도 중요합니다.
또, Hash 파티션을 생성할 때 2의 지수배로 만들라고 합니다. 8, 16, 32, 64, 128 ...
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 (sales_no)
(
partition SALES_P1,
partition SALES_P2,
partition SALES_P3,
partition SALES_P4
);
'IT관련' 카테고리의 다른 글
워드(MS-Word)에서 따옴표 입력시 자동변환 방지 세팅 방법 (1) | 2019.06.19 |
---|---|
오라클 에러 정보 (ORA-01653) - 테이블스페이스에서 테이블을 위한 공간 확장을 못하는 (0) | 2019.06.18 |
오라클 List Partition (특정한 값으로 구분되는 파티션 테이블) (1) | 2019.06.18 |
오라클 Range Partition (범위로 구분되는 파티션 테이블) (3) | 2019.06.18 |
오라클 파티션 종합 페이지 (Oracle Partition Main Page) (0) | 2019.06.18 |