TECH
QUESTION
자주하는 질문답변 입니다.
Oracle
작성자 | 유건데이타 | 등록일 | 2015-05-16 |
제목 | PARTITIONING 기능 | ||
---|---|---|---|
ORACLE 8I에서의 새로운 PARTITIONING 기능
======================================== SCOPE ----- Standard Edition 에서는 Partitioning Option 은 지원하지 않는다. PURPOSE -------- 여기서는 oracle8i에서 추가된 partitioning 기능에 대해 언급하고 그 간단한 예를 들어 본다. List of Oracle8i Enhancements Specific to Partitioning. ======================================================= - Hash Partitioning - Composite Partitioning - Partitioned Index-Organized tables - MERGE operation to allow merging of range partitions - Updatable partition keys - Partitioned LOB and object tables - Partition-wise join - Secondary indexes on non-primary key columns Hash Partitioning Hash partitioning은 partition column에 대해 hash function을 적용하여 입력되는 데이타가 파티션을 찾아가는 방법을 사용한다. 생성방법은 다음과 같다. SQL> CREATE TABLE emp_hpart( 2> empno NUMBER(4) NOT NULL, 3> ename VARCHAR2(10), 4> sal NUMBER(7,2)) 5> STORAGE (INITIAL 50k NEXT 50k) 6> PARTITION BY HASH(empno) PARTITIONS 4 7> STORE IN (data01,data02,data03,data04) 8> / 위 예제에서는 system에서 자동으로 부여된 이름으로 4개의 partition을 생성하고 있다. partition 이름은 SYS_Px와 같은 형태로 생성된다. SQL> SELECT table_name, partitioning_type, partition_count 2> FROM dba_part_tables; 3> WHERE table_name='EMP_HPART'; TABLE_NAME PARTITI PARTITION_COUNT ------------------------------ ------- -------------- EMP_HPART HASH 4 SQL> SELECT table_name, partition_name, tablespace_name 2> FROM dba_tab_partitions 3> WHERE table_name='EMP_HPART'; TABLE_NAME PARTITION_NAME TABLESPACE_NAME -------------- ------------------ ------------------ EMP_HPART SYS_P9 DATA01 EMP_HPART SYS_P10 DATA02 EMP_HPART SYS_P11 DATA03 EMP_HPART SYS_P12 DATA04 위에서는 partition 이름을 생략하였는데 명시적으로 파티션 이름을 주면서 생성할수 있다. 이경우는 partition number가 생략되며 추가적인 partition 부분에 대한 선언부가 필요하다. SQL> CREATE TABLE emp_hpart .... 5> PARTITION BY HASH(empno) 6> (PARTITION P1 TABLESPACE data01, 7> PARTITION P2 TABLESPACE data02, 8> PARTITION P3 TABLESPACE data03, 9> PARTITION P4 TABLESPACE data04) 10> / 여기서 EMP_HPART 테이블은8000개의 row를 가지고 있고 각 파티션은 대략 2000 records를 가지고 있다고 가정하자. hash partitioning의 기본 속성의 제한 때문에 partition에 관련된 작업을 수행하기에 제약사항이 있다. partition split, drop, merge등은 range partition에서는 가능한 작업이지만 hash partition에서는 다음과 같은 에러가 발생한다. ORA-14255: table is not partitioned by Range or Composite Range method 그러나 partition add는 가능하다. 그러면 오라클 커널은 SYS_P9에 있는 row들을 rehash 작업을 하여 P13에는 대략 1000 row가 들어가게 된다. 만약 P14 파티션을 다시 추가하려고 한다면 오라클 커널은 SYS_P10에 있는 row들을 rehash하려고 할 것이다. 이러한 방법으로 partition을 추가하는 것은 data가 고르게 파티션에 분배되지 못하는 결과를 가져온다. 그러므로 partition의 개수는 항상 2의 배수로 관리되는 것이 좋다. Composite partitioning composite partition은 range partition과 hash partition의 혼합된 형식임. 이러한 방식은 분기마다 한번씩 상당히 많은 량의 데이타가입력되는 datawarehouse와 같은 환경에서 사용되어질 수 있다. composite partitioning은 우선 range에 의해서 우선 partitioning을 하고 다시 그 partition을 hash function을 이용해서 sub-partitioning을 한다. 이런 방법은 range partitioning과 hash partitioning의 장점을 동시에 가질수 있다. SQL> ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY'; Session altered. SQL> CREATE TABLE sales99_cpart( 2> sale_id NUMBER NOT NULL, 3> sale_date DATE, 4> prod_id NUMBER, 5> qty NUMBER) 6> PARTITION BY RANGE(sale_date) 7> SUBPARTITION BY HASH(prod_id) SUBPARTITIONS 4 8> STORE IN (data01,data02,data03,data04) 9> (PARTITION cp1 VALUES LESS THAN('01-APR-1999'), 10> PARTITION cp2 VALUES LESS THAN('01-JUL-1999'), 11> PARTITION cp3 VALUES LESS THAN('01-OCT-1999'), 12> PARTITION cp4 VALUES LESS THAN('01-JAN-2000')) 13> / 위의 예에서는 SALE_DATE에 대해서 분기별로 4개의 partition으로 range partition되어 있는 SALES99_CPART 테이블을 보여주고 있다. 각각의 range는 PROD_ID에 의해 hash 되어 다시 각각 4개의 partition으로 나뉘어서 결과적으로 총 16개의 partition이 생성된다. DBA_SEGMENTS를 조회해 보면 다음과 같다. SQL> column segment_name format a15 SQL> column partition_name format a15 SQL> column tablespace_name format a15 SQL> SELECT segment_name, partition_name, segment_type, tablespace_name 2> FROM dba_segments 3> WHERE segment_name='SALES99_CPART'; SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME --------------- --------------- ------------------ --------------- SALES99_CPART SYS_SUBP21 TABLE SUBPARTITION DATA01 SALES99_CPART SYS_SUBP22 TABLE SUBPARTITION DATA02 SALES99_CPART SYS_SUBP23 TABLE SUBPARTITION DATA03 ... ... SALES99_CPART SYS_SUBP31 TABLE SUBPARTITION DATA03 SALES99_CPART SYS_SUBP32 TABLE SUBPARTITION DATA04 SALES99_CPART SYS_SUBP33 TABLE SUBPARTITION DATA01 SALES99_CPART SYS_SUBP34 TABLE SUBPARTITION DATA02 SALES99_CPART SYS_SUBP35 TABLE SUBPARTITION DATA03 SALES99_CPART SYS_SUBP36 TABLE SUBPARTITION DATA04 이러한 새로운 기능을 위해 추가된 새로운 data dictionary는 다음과 같다 DBA_TAB_SUBPARTITIONS DBA_SUBPART_KEY_COLUMNS DBA_IND_SUBPARTITIONS DBA_TAB_PARTITIONS DBA_PART_TABLES DBA_PART_INDEXES DBA_OBJECTS composite partitioned index는 항상 local index이며 default로 table subpartition과 같은 tablespace에 저장된다. 그러나 index level이나 index subpartition level에서 tablespace를 지정하는 것이 가능하다. composite partitioned table에 대해서 range partitioned global index는 지원이 되지만 composite partitioned globall index는 지원되지 않음. 891 보기 태그: |
Comment | |||
---|---|---|---|
등록된 코멘트가 없습니다. |