개발은 너무해

Partition Table(1) - Create 본문

Oracle/Oracle Study

Partition Table(1) - Create

까칠 평생초보 2009.06.17 12:06
파티션 테이블에는 여러가지가 있습니다.
그 중 가장 대표적으로 쓰이는 range partition 과 hash partition에 대해서 요약 정리를 하려고 합니다.

<Tablespace 생성>

일단 Partition Table을 생성하기 위해서 Tablespace를 3개만 생성하겠습니다.
SQL> create tablespace tbs1
  2  datafile 'D:\oracle\product\PROD\Disk5\tbs1.dbf' size 10m
  3* autoextend on maxsize 20m;
테이블스페이스가 생성되었습니다.
SQL> create tablespace tbs2
  2  datafile 'D:\oracle\product\PROD\Disk5\tbs2.dbf' size 10m
  3* autoextend on maxsize 20m;
테이블스페이스가 생성되었습니다.
SQL> create tablespace tbs3
  2  datafile 'D:\oracle\product\PROD\Disk5\tbs3.dbf' size 10m
  3* autoextend on maxsize 20m;
테이블스페이스가 생성되었습니다.

Range와 Hash partition 동일에 동일한 데이터를 insert를 하겠습니다.

--partition_insert.sql (hash partition에 insert시 테이블명을 수정해주세요.)
insert into range_emp(empno,ename,job,hiredate,sal)
                     values(999,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal)                    
                     values(1000,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal) 
                     values(1500,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal)  
                     values(1999,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal) 
                     values(2000,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal) 
                     values(2001,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal) 
                     values(2999,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal) 
                     values(3000,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal) 
                    values(1999,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal) 
                    values(3999,'Ultra','SALESMAN',sysdate,3000);

1. Range Partition
    특정 컬럼을 기준(ex. 날짜기준)으로 삼아 데이터를 해당 테이블 스페이스로 분산을 시켜주고,
    이로인해 데이터를 관리가 용이해지지만, 기준 컬럼에 의해 데이터들이 불균형 분포되어있거나,
    특정 기준값을 삭제한다면 테이블스페이스의 공간관리가 불균형해지고 관리가 힘들어집니다.

<Range Partition Table 만들기>

SQL> create table range_emp
  2  (empno number(4)
  3  ,ename varchar2(30)
  4  ,job varchar2(9)
  5  ,mgr number(4)
  6  ,hiredate date
  7  ,sal number(7,2)
  8  ,comm number(7,2)
  9  ,deptno number(2))
 10  partition by range(empno)
 11  (partition range_p1 values less than(2000) tablespace tbs1     --> 2000미만인 값들
 12  ,partition range_p2 values less than(3000) tablespace tbs2     --> 3000미만인 값들
 13* ,partition range_p3 values less than(4000) tablespace tbs3);  --> 4000미만인 값들
테이블이 생성되었습니다.
SQL>@partition_insert.sql

다른 값들은 볼 필요 없고 empno 를 기준으로 partition table을 만들었으니 이 값만 확인해도 되겠죠!

SQL> select empno from range_emp partition(range_p1);
     EMPNO
----------
       999
      1000
      1500
      1999
      1999
SQL> select empno from range_emp partition(range_p2);
     EMPNO
----------
      2000
      2001
      2999
SQL> select empno from range_emp partition(range_p3);
     EMPNO
----------
      3000
      3999

위와 같이 데이터가 들어간 것을 확인 할 수 있습니다.
데이터가 불균형하게 들어간 것을 볼 수 있습니다. 
테이블 스페이스의 space 관리가 잘못되고 있다는 것입니다.

2. Hash Partition

데이터 관리보다는 성능향상의 목적이 있습니다.
각각 다른 파티션에 데이터를 고르게 분산시킬수가 있습니다.
파티션 테이블 생성시에 반드시 파티션의 개수를 명시해야합니다.(데이터 분산을 위해서)
파티션의 수는 2의 거듭 제곱 수 (즉, 2,4,6,8,16,....)로 설정하는 것이 가장 이상적입니다.
저는 테이블 스페이스를 3개만 만들었으니 3개로만 하겠습니다.

<Hash Partition Table 만들기>

SQL> create table hash_emp
  2  (empno number(4)
  3  ,ename varchar2(30)
  4  ,job varchar2(9)
  5  ,mgr number(4)
  6  ,hiredate date
  7  ,sal number(7,2)
  8  ,comm number(7,2)
  9  ,deptno number(2))
 10  partition by hash(empno)   --자동으로 partition 이름을 만들어준다.
 11  partitions 3
 12* store in (tbs1, tbs2, tbs3);

or

SQL> create table hash_emp2
  2  (empno number(4)
  3  ,ename varchar2(30)
  4  ,job varchar2(9)
  5  ,mgr number(4)
  6  ,hiredate date
  7  ,sal number(7,2)
  8  ,comm number(7,2)
  9  ,deptno number(2))
 10  partition by hash(empno)     --파티션 이름을 수동으로 지정해 주고 싶을때.
 11  (partition hash_p1 tablespace tbs1
 12  ,partition hash_p2 tablespace tbs2
 13* ,partition hash_p3 tablespace tbs3)
테이블이 생성되었습니다.
SQL> @partition_insert.sql

SQL> select empno from hash_emp2 partition (hash_p1);
     EMPNO
----------
      1000
      1999
      1999

SQL> select empno from hash_emp2 partition (hash_p2);
     EMPNO
----------
       999
      2000
      2999
      3000
      3999

SQL> select empno from hash_emp2 partition (hash_p3);
     EMPNO
----------
      1500
      2001

데이터가 불규칙하게 각 테이블스페이스에 저장되어있는것을 확인해 볼 수 있습니다.
다음에는 파티션 테이블의 추가,삭제등 기본적인 관리 방법에 대해서 요약 하도록 하겠습니다.

'Oracle > Oracle Study' 카테고리의 다른 글

Oracle Default DB 내 맘대로 바꾸기.  (0) 2009.11.19
Partition Table(2) - Management  (0) 2009.06.17
Partition Table(1) - Create  (0) 2009.06.17
Row Migration  (0) 2008.11.30
10g Archive Mode로 변경  (0) 2008.10.01
Rollup & Cube & Grouping 차이  (0) 2008.05.16
0 Comments
댓글쓰기 폼