/* 테이블 초기화 */
DROP TABLE SOURCE;
DROP TABLE TARGET;
-- create source table : 3s
CREATE TABLE SOURCE AS
SELECT b.NO,a.*
FROM (SELECT * FROM emp WHERE rownum <=10)a
,(SELECT rownum AS NO FROM dual CONNECT BY LEVEL<=1000000)b;
CREATE TABLE target AS
SELECT * FROM SOURCE WHERE 1=2;
/* 0. 인덱스 생성 후 대량 데이터 인서 */
--PK 제약
ALTER TABLE target ADD
CONSTRAINT target_pk PRIMARY key(NO,empno);
--create normal index
CREATE INDEX target_x1 ON target(ename);
--count insert execute time: 27s
INSERT /*+ append */ INTO target
SELECT * FROM SOURCE;
SELECT count(*) FROM TARGET ;
-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>total execution time: 0+0+27s = 27s
/* 1. PK 제약과 인덱스 해제 - PK 제약에 Unique 인덱스를 사용한 경우 */
-- 테이블 비우기
TRUNCATE TABLE target;
-- PK 제약 disable 비활성화 처리
ALTER TABLE target MODIFY CONSTRAINT target_pk disable DROP INDEX;
-- 일반 인덱스(x1)도 비활성화(unusable)
ALTER INDEX target_x1 unusable;
-- 비활성화 처리 인덱스 스킵 설정
ALTER SESSION SET skip_unusable_indexes = TRUE;
--count insert execute time: 2s
INSERT /*+ append */ INTO target
SELECT * FROM SOURCE;
-- 다시 PK 제약 활성화: 3s
ALTER TABLE target MODIFY CONSTRAINT target_pk enable novalidate;
-- 일반 인덱스(x1)도 재활성: 3s
ALTER INDEX target_x1 rebuild;
-- 중복(무결성)체크
SELECT NO,empno,count(*) FROM SOURCE GROUP BY NO, empno HAVING count(*)>1;
-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>total execution time: 2+3+3 = 8s
/* 2. PK 제약과 인덱스 해제 - PK 제약에 Non-Unique 인덱스를 사용한 경우 */
-- PK 제약 unusable 비활성화 처리
ALTER INDEX target_pk unusable;
-- PK 인덱스를 사용할 수 없는 상태
INSERT INTO TARGET
SELECT * FROM SOURCE;
-- PK 인덱스는 처음과 같은 사용불가능한 상태
INSERT /*+ append */ INTO TARGET
SELECT * FROM SOURCE;
-- >>>>> PK 인덱스를 Drop 하지 않고 Unusable 상태에서 데이터를 입력하고 싶다면,
-- >>>>> 아래와 같이 PK 제약에 Non-Unique 인덱스를 사용하면 됨
-- 테이블 비우기
TRUNCATE TABLE target;
-- PK 인덱스 Drop 처리
ALTER table target DROP PRIMARY KEY DROP INDEX;
-- Non-Unique 인덱스 생성
CREATE INDEX target_pk ON target(NO,empno);
-- PK 제약에 Non-Unique 인덱스 사용하도록 지정
ALTER TABLE target ADD CONSTRAINT target_pk PRIMARY key(NO,empno)
USING INDEX target_pk; -- 해당 구문이 들어가면 Non-UNIQUE 인덱스 사용하도록 지정됨
/* 인덱스 비활성화 처 */
-- PK 제약을 비활성화하고, 인덱스를 Unusable 상태로 변경
ALTER TABLE target MODIFY CONSTRAINT target_pk disable keep INDEX;
ALTER INDEX target_pk unusable;
ALTER INDEX target_x1 unusable;
-- insert data 1s
INSERT /*+ append */ INTO target SELECT * FROM SOURCE;
/* 인서트 끝났으면 인덱스 다시 활성화 처리 */
ALTER INDEX target_x1 rebuild; --3s
ALTER INDEX target_pk rebuild; --3s
ALTER TABLE target MODIFY CONSTRAINT target_pk enable novalidate;
-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>total execution time: 1+3+3 = 7s