I. 테스트 환경 구성
1. 스키마 생성 및 권한 부여
테스트 스키마 생성 및 권한 부여
create tablesapce PT_TEST datafile '+DATA' size 3G; create user TEST identified by TEST default tablespace PT_TEST; grant CONNECT, RESOURCE, UNLIMITED TABLESPACE to TEST;
2. 테스트용 원본 테이블 생성
A) 원본 테이블 생성
테스트용 원본 테이블 생성
create table TEST.EXTEST ( BASE_DT varchar2(8) not null, TESTCOL1 varchar2(20) not null, TESTCOL2 number not null, TESTCOL3 char(20) not null, TESTCOL4 varchar2(20), TESTCOL5 char(20), TESTCOL6 nchar(20), TESTCOL7 varchar2(20), TESTCOL8 varchar2(20), TESTCOL9 varchar2(20), constraint PK_EXTEST primary key (BASE_DT,TESTCOL1,TESTCOL2) ) tablespace USERS; -- 초기 데이터는 USERS에 적재
B) 랜덤 데이터 입력
랜덤 데이터 입력
insert into TEST.EXTEST select to_char(sysdate-dbms_random.value(0,365*7),'RRRRMMDD') as BASE_DT, dbms_random.string('A',20) as TEST_COL1, dbms_random.value(0,1000) as TEST_COL2, dbms_random.string('A',20) as TEST_COL3, dbms_random.string('A',20) as TEST_COL4, dbms_random.string('A',20) as TEST_COL5, NCHR(dbms_random.value(44032, 55203)) || NCHR(dbms_random.value(44032, 55203)) || -- 2 NCHR(dbms_random.value(44032, 55203)) || NCHR(dbms_random.value(44032, 55203)) || -- 4 NCHR(dbms_random.value(44032, 55203)) || NCHR(dbms_random.value(44032, 55203)) || -- 6 NCHR(dbms_random.value(44032, 55203)) || NCHR(dbms_random.value(44032, 55203)) || -- 8 NCHR(dbms_random.value(44032, 55203)) || NCHR(dbms_random.value(44032, 55203)) || -- 10 NCHR(dbms_random.value(44032, 55203)) || NCHR(dbms_random.value(44032, 55203)) || -- 12 NCHR(dbms_random.value(44032, 55203)) || NCHR(dbms_random.value(44032, 55203)) || -- 14 NCHR(dbms_random.value(44032, 55203)) || NCHR(dbms_random.value(44032, 55203)) || -- 16 NCHR(dbms_random.value(44032, 55203)) || NCHR(dbms_random.value(44032, 55203)) || -- 18 NCHR(dbms_random.value(44032, 55203)) || NCHR(dbms_random.value(44032, 55203)) as TEST_COL6, --20 dbms_random.string('A',20) as TEST_COL7, dbms_random.string('A',2) || -- 2 NCHR(dbms_random.value(44032, 55203)) || NCHR(dbms_random.value(44032, 55203)) || -- 8 NCHR(dbms_random.value(44032, 55203)) || NCHR(dbms_random.value(44032, 55203)) || -- 14 NCHR(dbms_random.value(44032, 55203)) || NCHR(dbms_random.value(44032, 55203)) as TEST_COL8, --20 dbms_random.string('A',20) as TEST_COL9 from DUAL connect by level <= 5000000; -- 메모리 부족 발생시 1000000건으로 5번 수행
II. 테이블 파티셔닝
1. 파티션 테이블 생성
A) 세션 병렬 처리 설정
세션 병렬 처리 설정
alter session enable parallel ddl; alter session enable parallel dml; alter session force parallel dml parallel 8; alter session force parallel ddl parallel 8; alter session force parallel query parallel 8; -- cpu_count 파라미터보다 1 적은 숫자로 입력 (최대값)
B) 테이블 생성
파티션 테이블 생성
create table TEST.EXTEST_PT ( BASE_DT varchar2(8) not null, TESTCOL1 varchar2(20) not null, TESTCOL2 number not null, TESTCOL3 char(20) not null, TESTCOL4 varchar2(20), TESTCOL5 char(20), TESTCOL6 nchar(20), TESTCOL7 varchar2(20), TESTCOL8 varchar2(20), TESTCOL9 varchar2(20) ) tablespace PT_TEST -- nologging ==> 데이터를 적재하는 작업이 아닌 segment를 교환하는 작업이므로 nologging 옵션이 필요하지는 않음 partition by range (BASE_DT) ( partition EXTEST_PT_P1 values less than ('20250101') ); -- 단일 파티션을 생성하여 원본 테이블과 교체한 후에 분할하는 방식임 -- exchange 시 1개 파티션과 1개 테이블이 1대 1로 교체될 뿐, 키 값에 따라 다른 파티션에 데이터가 배포되지는 않음
C) 인덱스 및 제약조건 생성
PK 인덱스 생성
create unique index TEST.PK_EXTEST_PT on TEST.EXTEST_PT (BASE_DT,TESTCOL1,TESTCOL2) local tablespace PT_TEST;
PK 제약조건 생성
alter table TEST.EXTEST_PT add constraint PK_EXTEST_PT primary key (BASE_DT,TESTCOL1,TESTCOL2) using index;
2. 파티션 교환
파티션 Exchange
alter table TEST.EXTEST_PT exchange partition EXTEST_PT_P1 with table TEST.EXTEST including indexes;
3. 파티션 분할
4. 이름 변경
A) 테이블 이름 변경
테이블명 변경
drop table TEST.EXTEST; -- 빈 파티션에서 나온 빈 테이블 alter table TEST.EXTEST_PT rename to EXTEST;
B) 인덱스 및 제약조건 이름 변경
PK 제약조건 이름 변경
alter table TEST.EXTEST rename constraint PK_EXTEST_PT to PK_EXTEST; alter index TEST.PK_EXTEST_PT rename to PK_EXTEST;
기술 메모
- 원본 테이블과 파티션 테이블의 인덱스가 일치하지 않을 경우, ORA-14098 에러가 발생되며 exchange가 진행되지 않음
: 반드시 동일한 구조의 인덱스를 파티션에도 만들어 두어야 함
: local 파티션 인덱스 생성 권장 - Split 수행시 분할된 파티션을 만들어 데이터를 내부적으로 적재하는 과정에서 테이블스페이스의 공간을 사용함
: 원본 테이블만큼의 테이블스페이스 내의 빈 용량이 필요함 - Partition Split을 사용하는 방식이므로 범위(range) 및 리스트(list) 파티션에 사용함