/* 테이블 초기화 */
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