파티션 테이블 처리

1. Partitioned Table이란? ◈ Partitioning 이란 큰 Object 를 작고 Manage가 가능하게 분리하는 것을 의미하며, Table 이나 Index 에서만 가능하고 Cluster, Snapshot 은 불가능 합니다. (Oracle8기준) ◈ 각 Partition 은 별개의 Segment에 저장 되어 집니다. ◈ Oracle8에서 Table은 기본이 되는 Key Value에 의해 Partition으로 분리되어 집니다. ◈ 각 Partition은 독립적으로 운영 됩니다. ◈ 예를 들면 Table Partition은 DML(insert, update, delete) 문에 의한 Transaction이 다른 Partition에 영향을 주지 않고 사용이 가능 합니다. ◈ DBA_TAB_PARTITIONS에 각 Partition의 Storage 정보가 있습니다.
2. 장점 ◈ 여러 분할 영역에서의 데이터 훼손 가능성이 감소 됩니다. ◈ 각 분할 영역을 독립적으로 백업하고 복구 할 수 있습니다. ◈ 더 용이하게 관리할 수 있으며 가용성 및 성능을 향상 시킵니다.
3. 파티션 테이블 생성 예제◈ 파티션 테이블을 범위 분할 방식(PARTITION BY RANGE)으로 생성 했습니다. SQL>CREATE TABLE emp_pt (EMPNO NUMBER(4), ENAME VARCHAR2(30), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2)) PARTITION BY RANGE(EMPNO)( -->범위 분할 방식으로 생성 합니다. PARTITION emp_p1 VALUES LESS THAN (2000) TABLESPACE data1, PARTITION emp_p2 VALUES LESS THAN (4000) TABLESPACE data2, PARTITION emp_p3 VALUES LESS THAN (7000) TABLESPACE data3);
테이블이 생성되었습니다. emp_p1 파티션은 2000보다 적은 값이 들어가며 data1 테이블스페이스에, emp_p2 파티션은 4000보다 적은 값이 들어가며 data2 테이블스페이스에, emp_p3 파티션은 7000보다 적은 값이 들어가며 data3 테이블스페이스에 각각 할당을 했습니다. 각각의 파티션을 일정한 범위로 나누어서 각각의 테이블 스페이스를 할당 했습니다. 오라클에서는 이 외에도 여러 가지 다른 방법으로 파시션 테이블을 생성 할 수 있습니다. 여기서는 가장 이해하기 쉬운 범위 분할 방식으로 생성 했습니다.
4. 데이터 조작 예제◈ INSERT-- emp_p1 파티션에 등록이 됩니다. SQL>INSERT INTO emp_pt(empno, ename, job, hiredate, sal) VALUES(1000, 'Ultra', 'SALESMAN', sysdate, 3000);1 개의 행이 만들어졌습니다. -- emp_p2 파티션에 등록이 됩니다. SQL>INSERT INTO emp_pt(empno, ename, job, hiredate, sal) VALUES(2000, 'lion', 'CLERK', sysdate, 2500);1 개의 행이 만들어졌습니다.☞ 위의 두 예제와 같이 일반적으로 Insert를 해도 empno에 따라서 자동적으로 파티션이 나누어져 Insert가 됩니다. 아래의 예제와 같이 따로 파티션을 지정해서 Insert를 할 수도 있습니다. -- 파티션을 통해서 INSERT하는 방법SQL>INSERT INTO emp_pt PARTITION (emp_p3) VALUES (6000, 'scott2', 'CLERK', 5000, sysdate, 1500,0 ,10);1 개의 행이 만들어졌습니다.◈ SELECT -- emp_p1파티션 조회SQL>SELECT empno, ename, job FROM emp_pt PARTITION (emp_p1); EMPNO ENAME JOB---------- -------------------- --------- 1000 Ultra SALESMAN-- emp_p2파티션 조회SQL>SELECT empno, ename, job FROM emp_pt PARTITION (emp_p2); EMPNO ENAME JOB---------- ------------------- --------- 2000 lion CLERK ◈ UPDATE/DELETE -- 파티션을 통해서 UPDATE 예제.SQL>UPDATE emp_pt PARTITION (emp_p3) SET sal = 4000 WHERE empno = 5000;1 행이 갱신되었습니다. -- 파티션을 통해서 DELETE 예제.SQL>DELETE FROM emp_pt PARTITION (emp_p3) WHERE empno = 6000;1 행이 삭제되었습니다.
5. Partition Table 관련한 Dictionary 정보◈ Storage Parameters DBA_TAB_PARTITIONS를 통해서 확인 할 수 있습니다. ◈ Partiton Table 의 Upper Partition Bound SQL>SELECT high_value, partition_position FROM sys.dba_tab_partitions WHERE table_name = 'EMP_PT'; HIGH_VALUE PARTITION_POSITION------------ --------------4000 2MAXVALUE 32000 1
6. 참고 : 오라클 9i에서의 리스트 분할기능..http://www.oracle.com/kr/magazine/archive/22spring/index.html?otn2_1.html
* 파티션 테이블 관리
1.Partition을 추가하는 방법 empno에 대해서 Partition을 추가 하고 싶은 경우 다음과 같이 할 수 있습니다. SQL>ALTER TABLE emp_pt ADD PARTITION emp_p4 VALUES less than (9000) TABLESPACE test;테이블이 변경되었습니다.ALTER TABLE 테이블명 ADD PARTITIOM 파티션명 VALUES 범위 TABLESPACE 테이블스페이스명으로 empno값이 9000이전의 값을 가지는 파티션 emp_p4를 추가했습니다.
2. 특정 Partition을 삭제하는 방법 Partition을 없애고 싶은 경우는 DROP PARTITION 명령어를 사용하면 됩니다. SQL>ALTER TABLE emp_pt DROP PARTITION emp_p4;테이블이 변경되었습니다.
3. Partition Name을 변경하는 방법 Partition Name 을 바꾸고 싶다면 RENAME PARTITION 명령어를 사용하면 됩니다. SQL>ALTER TABLE emp_pt RENAME PARTITION emp_p3 to emp_p; 테이블이 변경되었습니다.emp_p3 파티션의 이름을 emp_p로 변경 하였습니다.
4. Partition의 Tablespace를 옮기는 방법 MOVE PARTITION 명령어를 이용해서 테이블스페이스를 변경 할 수 있습니다. SQL>ALTER TABLE emp_pt MOVE PARTITION emp_p3 TABLESPACE test nologging;테이블이 변경되었습니다.Partition emp_p3의 테이블스페이스를 data3에서 test로 변경했습니다.
5. 특정 Partition의 Data를 Truncate하는 방법TRUNCATE PARTITION 명령을 사용하여 특정 파티션의 테이터를 Truncate시킬수 있습니다. Truncate는 Rollback 이 불가능하며 특정Partition 전체를 삭제하므로 주의해서 사용해야 합니다. SQL>ALTER TABLE emp_pt TRUNCATE PARTITION emp_p3;테이블이 잘렸습니다.