ALTER TABLE AA NOLOGGING;
ALTER TABLE AA NOLOGGING;
INSERT /*+ append */ INTO AA
SELECT * FROM BB;
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ parallel(AA, 4) */ INTO AA
SELECT * FROM BB;
(DB 로그는 Archive 모드 항목에 기술한 명령문 외에 다른 옵션이나 설정은 전혀 활성화하지 않은 상태임)
INSERT INTO TARGET_T
SELECT * FROM SOURCE_T;
COMMIT;
INSERT /*+ NOLOGGING */ INTO TARGET_T
SELECT * FROM SOURCE_T;
INSERT /*+ APPEND */ INTO TARGET_T NOLOGGING
SELECT * FROM SOURCE_T;
ALTER TABLE TARGET_T NOLOGGING;
INSERT /*+ APPEND */ INTO TARGET_T
SELECT * FROM SOURCE_T;
ALTER TABLE TARGET_T NOLOGGING;
INSERT /*+ PARALLEL(T, 4) */ INTO TARGET_T T
SELECT * FROM SOURCE_T;
✅ INSERT 튜닝 순서
- (1) NOLOGGING 모드 :: 로그를 안 남기고 INSERT
ALTER TABLE AA NOLOGGING;
- nologging 모드는 Redo 로그를 생성하지 않게 하는 옵션이므로 Direct Path Insert와 직접적인 관련은 없다.
- 다만, 이 기능은 Direct Path Insert 할 때만 테이블을 nolopping 모드로 전환한 상태에서 작동할 뿐이다.
- (2) Direct Path Insert :: HWM 바깥 영역에 데이터를 순차적으로 입력(버퍼캐시 탐색X)
INSERT /*+ append */ INTO AA SELECT * FROM BB;
- 로깅을 할 수도 안 할 수도 있다.
- 이 기능의 핵심은 버퍼캐시 탐색(LRU 알고리즘)을 안 하고 HWM 바깥 영역에 데이터를 순차적으로 입력한다는 데에 있다.
- (3) 인덱스 , 제약 조건 비활성화
- (4) 병렬 INSERT
ALTER SESSION ENABLE PARALLEL DML; INSERT /*+ parallel(AA, 4) */ INTO AA SELECT * FROM BB;
- 병렬로 INSERT 할 때는 APPEND 힌트를 지정하지 않아도 자동으로 Direct Path Insert 기능이 작동한다.
INSERT INTO TARGET_T
SELECT * FROM SOURCE_T;
COMMIT;
(단, TARGET_T 테이블에 PK 인덱스(TARGET_T_PK)만 존재하며, 다른 인덱스는 없는 상태임)
DELETE FROM TARGET_T;
COMMIT;
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ APPEND */ INTO TARGET_T T1
SELECT /*+ FULL(T2) PARALLEL(T2 4) */ *
FROM SOURCE_T T2;
ALTER SESSION DISABLE PARALLEL DML;
TRUNCATE TABLE TARGET_T;
ALTER SESSION ENABLE PARALLEL DML;
ALTER TABLE TARGET_T NOLOGGING;
ALTER TABLE T1 MODIFY CONSTRAINT T1_PK DISABLE DROP INDEX;
INSERT /*+ PARALLEL(T1 4)*/ INTO TARGET_T T1
SELECT /*+ FULL(T2) PARALLEL(T2 4) */ *
FROM SOURCE_T T2;
COMMIT;
ALTER TABLE T1 MODIFY CONSTARINT T1_PK ENABLE NOVALIDATE;
ALTER TABLE TARGET_T LOGGING;
ALTER SESSION DISABLE PARALLEL DML;
✅ NO_LOGGING 모드 설정법
- 해도 되고 안 해도 되지만
DIRECT PATH INSERT
시에만 작동한다.ALTER TABLE T1 NOLOGGING; ALTER TABLE T1 LOGGING;
✅ 제약을 해제하고 인덱스를 Unusable 상태로 변경법
ALTER TABLE T1 MODIFY CONSTRAINT T1_PK DISABLE DROP INDEX; ALTER TABLE T1 MODIFY CONSTARINT T1_PK ENABLE NOVALIDATE;
✅ 인덱스 UNABLE 설정법
ALTER TABLE T1 NOLOGGING; ALTER TABLE T1 LOGGING;
✅ 병렬 모드 설정법
ALTER SESSION ENABLE PARALLEL DML; ALTER SESSION DISABLE PARALLEL DML;
• UPDATE문에서 C1 조건절을 만족하는 데이터는 90% 이상이다.
• MYTAB 테이블의 PK는 DT + ID이다.
• 병렬 처리는 활용할 수 없다.
CREATE TABLE MYTAB_TEMP
AS
SELECT CO AS ID, C1, C2, C3, C4
FROM YOURTAB@RDS
WHERE 1 = 2;
ALTER TABLE MYTAB_TEMP ADD CONSTRAINT MYTAB_TEMP_PK PRIMARY KEY ( ID );
DECLARE
V_CNT NUMBER;
BEGIN
INSERT INTO MYTAB_TEMP
SELECT C0, C1, C2, C3, 4
FROM YOURTAB@RDS
WHERE CO IS NOT NULL
AND C5 > 0;
UPDATE MYTAB_TEMP SET C4 = C4 + 1 WHERE C1 < TRUNC(SYSDATE);
-배치 프로그램을 재실행할 경우를 대비하기 위한 DELETE (보통 0건 삭제)
DELETE FROM WYTAB WHERE DT = TO_CHAR(SYSDATE, 'YYYYMMDD');
INSERT INTO MYTAB (DT, ID, C1, C2, C3, C4)
SELECT TO_CHAR(SYSDATE, 'YYYYMMDD'), A.* FRON MYTAB_TEMP A;
V_CNT := SQL&ROWCOUNT;
INSERT_LOG ( SYSDATE, 'INSERT MYTAB_TEMP', 'SUCCESS', V_CONT || 'ROWS' );
COMMIT;
EXCEPTION
WHEN dup_val_on_index THEN
INSERT_LOG ( SYSDATE, "INSERT WYTAB_TEMP", "FAIL', '중복 데이터' );
END;
DROP TABLE MYTAB_TEMP;
CREATE TABLE T1 NOLOGGING
AS SELECT ~
SELECT C0, C1, C2, C3, (CASE WHEN C1 < TRUNC(SYSDATE) THEN C4 +1 ELSE C4 END ) C4
FROM YOURTAB@RDS
WHERE CO IS NOT NULL
AND C5 > 0;
CREATE TABLE MYTAB_TEMP NOLOGGING
AS
SELECT C0 AS ID, C1, C2, C3, (CASE WHEN C1 < TRUNC(SYSDATE) THEN C4 +1 ELSE C4 END ) C4
FROM YOURTAB@RDS
WHERE CO IS NOT NULL
AND C5 > 0;
DECLARE
V_CNT NUMBER;
BEGIN
SELECT COUNT(*) INTO V_CNT FROM (
SELECT ID
FROM MYTAB_TEMP
GROUP BY ID
HAVING COUNT(*) > 1
);
IF V_CNT > 0 THEN
INSERT_LOG ( SYSDATE, "INSERT WYTAB_TEMP", 'FAIL', '중복 데이터' );
ELSE
-배치 프로그램을 재실행할 경우를 대비하기 위한 DELETE (보통 0건 삭제)
DELETE FROM MYTAB WHERE DT = TO_CHAR(SYSDATE, 'YYYYMMDD');
INSERT INTO MYTAB (DT, ID, C1, C2, C3, C4)
SELECT TO_CHAR(SYSDATE, 'YYYYMMDD'), A.* FRON MYTAB_TEMP A;
V_CNT := SQL&ROWCOUNT;
INSERT_LOG ( SYSDATE, 'INSERT MYTAB_TEMP', 'SUCCESS', V_CONT || 'ROWS' );
ENDIF;
COMMIT;=
END;
DROP TABLE MYTAB_TEMP;
ss