ORACLE SPLIT
RANGE-PARTITIONED SEGMENT v1.0
2011-04-15 |
1.0 |
|
|
|
|
|
|
|
1.
SPLIT
PARTITION (RANGE)
Range-Partitiioned
Table 에 대해 Split partition
을 진행할 때는 기준이 되는 Value 선정에 주의해야 한다.
당연히도 해당
Value 에 따라 Partition Segment 를 어느것을 사용할지 결정이 되기 때문이다.
SPLIT 을 해야하는 경우는 다음과 같다.
-
데이터가 사용자 예측치보다 비대해져
하나의 Partition Segment 를 분할해야 하는 경우
-
잘못된 기준값 사용으로 데이터의 위치(세그먼트 레벨로 보았을 때) 가 잘못되었고 이를 바로 잡아야 하는
경우
2.
SYNTAX
가장 기본적인 구문만 적어넣으면 다음과 같다.
alter table table_name
split partition partition_segment_name at (value)
into (partition partition_segment_name1,
partition partition_segment_name2)
구문을 보면 split
을 할 partition segment 를 지정한다. 그리고 at 에서 range 로 사용할 기준값을 넣는다. 이 값은 less than (해당 값보다 작은) 을 의미하며 추후 dba_tab_partitions.highvalue 와
동일하다. 이 값보다 작은 값은 partition_segment_name1
에 들어가고 큰 값은 partition_segment_name2 에 들어가게 된다.
3.
주의사항
Partition Table 에 대해 작업을 하는 경우 Index 가 Unusable 한 상태가 된다. 이는 Global 이냐 Local 이냐에 따라 그 파급력이 다르다.
Global Index 인 경우 Partition Segment 에 변경이 일어나면
인덱스 전체가 Unusable 상태가 된다. 반대로 Local 의 경우 Partitiioned 되어 있기에 일부분이 Unusable 이 된다.
파티션 테이블의 크기가 일반적으로 매우 거대하기 때문에
인덱스도 이와 비례해 큰 경우가 일반적이다. 이를 rebuild 해야
사용가능하기에 파티션 테이블에 작업이 있다면 업무시간을 피해야 할 것이다.
4.
PRACTICE
<QESTION>
at (value) 에 들어가는 value 는
into 절의 좌측 파티션에 들어가는 값인지 확인
<SOLUTION>
SQL> CREATE TABLE ADDRESS
2 (stdate varchar(8))
3 PARTITION BY RANGE ( stdate )
4 (PARTITION TB1 VALUES LESS THAN
( '20110431' ),
5 PARTITION TB VALUES LESS THAN
(MAXVALUE));
Table created.
SQL> INSERT INTO ADDRESS
VALUES('20110531');
1 row created.
SQL> COMMIT;
Commit complete.
SQL> exec
dbms_stats.gather_table_stats('SYS','ADDRESS');
PL/SQL procedure successfully completed.
SQL> select
table_name,partition_name,num_rows
2 from dba_tab_partitions
3 where table_name = 'ADDRESS';
TABLE_NAME PARTITION_NAME NUM_ROWS
------------------------------
------------------------------ ----------
ADDRESS TB1 0
ADDRESS TB 1
5월 31일 값이 TB 에 들어간 것을 확인했다. 5월 31일의 RANGE 는 MAXVALUE
이다.
(RANGE PARTITION 의 경우 RANGE 에 해당하지
않는 값들은 모두 MAXVALUE 에 입력된다.)
SQL>
alter table address
2 split partition tb
at('20110531')
3 into (partition tb2, partition
tb);
Table altered.
경계값인 20110531 을 AT 의 VALUE 로 파티션 세그먼트를 추가했다. VALUE 가 LESSTHAN 을 의미한다면 새로추가하는 TB2 에는 값이 들어가지 않을 것이다.
SQL> exec
dbms_stats.gather_table_stats('SYS','ADDRESS');
PL/SQL procedure successfully completed.
SQL> select
table_name,partition_name,num_rows
2 from dba_tab_partitions
3 where table_name = 'ADDRESS';
TABLE_NAME PARTITION_NAME NUM_ROWS
------------------------------
------------------------------ ----------
ADDRESS TB1 0
ADDRESS TB2 0
ADDRESS TB 1
결과를 확인한 결과 MAXVALUE 를
사용하는 TB 로 20110531 값이 들어갔음을 알 수
있었다.
결론을 이야기 하면 CHARACTER 형
(length 가 일정한) 숫자값을 입력한 경우 해당 값보다
하나 더 큰 값을 at 의 value 로 입력해야 한다.
또 앞서 high value 에는 at 의 value 가 들어간다고 이야기 했는데 이는 다음과 같이
확인할 수 있다.
SQL> select
table_name,partition_name,high_value
2 from dba_tab_partitions
3 where table_name = 'ADDRESS'
4 order by 2 asc
5 /
TABLE_NAME PARTITION_NAME HIGH_VALUE
---------- ---------------
--------------------
ADDRESS
TB MAXVALUE
ADDRESS
TB1 '20110431'
ADDRESS
TB2 '20110531'