Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-15
제목 일반 TABLE을 PARTITIONED TABLE로 변환시 INDEX도 같이 변환하는 방법
일반 TABLE을 PARTITIONED TABLE로 변환시 INDEX도 같이 변환하는 방법

================================================================



PURPOSE
-------
partition exchange방법중 index까지 같이 변환하는 방법을 설명한다.(bul.18004 참조)


SCOPE
-----
Oracle Partitioning Option은 8~10g Standard Edition에서는 지원하지
않는다.


Explanation
-----------
이때 dummy table에 미리 index를 생성해놓고, 이것을 exchange시 index도 같이 partition으로 생성할수 있는데,
이경우 including indexes라는 option을 사용한다.


Example
-------
다음 script를 이용해서 이 방법을 test해볼수 있다.

--------------- script --------------------------

drop table p_emp;
drop table d_y;
drop table d_z;

CREATE TABLE p_emp
(sal NUMBER(7,2),
empno number(4),
ename varchar2(10))
PARTITION BY RANGE(sal)
(partition emp_p1 VALUES LESS THAN (2000),
partition emp_p2 VALUES LESS THAN (MAXVALUE));

create table d_y
(sal NUMBER(7,2),
empno number(4),
ename varchar2(10))
tablespace tools;

create table d_z
(sal NUMBER(7,2),
empno number(4),
ename varchar2(10))
tablespace tools;

insert into d_y
select sal, empno, ename from emp where sal < 2000;

insert into d_z
select sal, empno, ename from emp where sal >= 2000;

commit;

create index i_p on p_emp(empno) local;

create index i_y on d_y(empno) storage ( initial 2k next 2k pctincrease 0) tablespace knam;
create index i_z on d_z(empno) storage ( initial 2k next 2k pctincrease 0) tablespace knam;

alter table p_emp exchange partition emp_p1
with table d_y including indexes;

alter table p_emp exchange partition emp_p2
with table d_z including indexes;

------------ end -------------------------

index가 정상적으로 바뀌었는지 확인하려면 다음 sql을 이용한다.

exchange를 하기 전
------------------
SQL> select segment_name, bytes, blocks, extents from user_segments
where segment_name = 'I_Y';
SEGMENT_NAME BYTES BLOCKS EXTENTS
-------------------- ---------- ---------- ----------
I_Y 327680 160 5

SQL> select partition_name, bytes, blocks, extents from user_segments where segment_name = 'I_P';
PARTITION_NAME BYTES BLOCKS EXTENTS
------------------------------ ---------- ---------- ----------
EMP_P1 65536 32 1
EMP_P2 65536 32 1


including index option을 사용하지 않은 경우
---------------------------------------
이 경우 index의 size를 보면 변경되지 않고 기존의 segment그대로 있고, status도 'UNUSABLE'상태이다.

SQL> select segment_name, bytes, blocks, extents from user_segments
where segment_name = 'I_Y';
SEGMENT_NAME BYTES BLOCKS EXTENTS
-------------------- ---------- ---------- ----------
I_Y 327680 160 5

SQL> select partition_name, bytes, blocks, extents from user_segments where segment_name = 'I_P';
PARTITION_NAME BYTES BLOCKS EXTENTS
------------------------------ ---------- ---------- ----------
EMP_P1 65536 32 1
EMP_P2 65536 32 1

SQL> select index_name, partition_name, status from user_ind_partitions where index_name = 'I_P';

INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ --------
I_P EMP_P1 UNUSABLE
I_P EMP_P2 UNUSABLE


including index option을 사용하여 exchage했을경우
----------------------------------------------
index의 size도 바뀌었고, status가 'USABLE'이다.

SQL> select segment_name, bytes, blocks, extents from user_segments
where segment_name = 'I_Y';

SEGMENT_NAME BYTES BLOCKS EXTENTS
-------------------- ---------- ---------- ----------
I_Y 65536 32 1

SQL> select partition_name, bytes, blocks, extents from user_segments where segment_name = 'I_P';

PARTITION_NAME BYTES BLOCKS EXTENTS
------------------------------ ---------- ---------- ----------
EMP_P1 327680 160 5
EMP_P2 65536 32 1

SQL> select index_name, partition_name, status from user_ind_partitions where index_name = 'I_P';

INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ --------
I_P EMP_P1 USABLE
I_P EMP_P2 USABLE

Reference Documents
-------------------
note.198120.1

Comment
등록된 코멘트가 없습니다.