본문 바로가기

카테고리 없음

ORACLE SPLIT RANGE-PARTITIONED SEGMENT v1.0

                          

ORACLE SPLIT RANGE-PARTITIONED SEGMENT v1.0

 

Date

Ver

Etc.

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'