Skip to content
튜닝 연습DML과 배치 튜닝
DML-033

보관본 적재에 NOLOGGING까지 붙였는데 운영 redo가 47.9MB 그대로다

기초INSERT한빛유통458 / 700

상황 ​

야간 체인 ①(T_ORD_BIG 재적재) 앞에는 「재적재 전 보관본」 단계가 있다. 재적재가 잘못되면 되돌릴 수 있도록 지금의 T_ORD_BIG을 T_ORD_BIG_BAK에 통째로 떠 둔다. 연습 DB에서 /*+ APPEND */를 붙이자 redo가 0.2MB로 줄었는데, 운영에 반영하니 47.9MB가 그대로 나왔다. 오과장: "그래서 NOLOGGING도 붙였어요. 그런데 숫자가 하나도 안 바뀌어요." 운영 DBA는 일요일 밤 아카이브 로그가 평일의 세 배라며 줄여 달라고 한다.

테이블과 인덱스 ​

  • T_ORD_BIG: 1,000,000행 · 5,826블록(약 46MB)
  • T_ORD_BIG_BAK 보관본(문제 설정, T_ORD_BIG과 같은 컬럼): 매주 비우고 다시 채운다. 인덱스, 제약, 트리거는 없고, 재적재가 실패했을 때만 읽는다.
  • 운영 DB는 ARCHIVELOG이고 FORCE_LOGGING은 NO다. 연습 DB는 NOARCHIVELOG다. 운영 백업은 매일 06:00 RMAN 증분 백업이다.

원본 SQL ​

sql
-- 일요일 21:50 · 재적재 전 보관본 (오과장 · 지난주 수정)
TRUNCATE TABLE T_ORD_BIG_BAK;

INSERT /*+ APPEND */ INTO T_ORD_BIG_BAK NOLOGGING
SELECT * FROM T_ORD_BIG;
COMMIT;

실행계획 학습용 예시 ​

xplan
[실행계획 — 운영]
------------------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name          | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT                 |               |      1 |        |      0 |00:00:02.84 |    6140 |
|   1 |  LOAD AS SELECT                  | T_ORD_BIG_BAK |      1 |        |      0 |00:00:02.84 |    6140 |
|   2 |   OPTIMIZER STATISTICS GATHERING |               |      1 |   1000K|   1000K|00:00:00.41 |    5826 |
|   3 |    TABLE ACCESS FULL             | T_ORD_BIG     |      1 |   1000K|   1000K|00:00:00.18 |    5826 |
------------------------------------------------------------------------------------------------------------

[세션 통계 — 같은 문장 · 두 DB]
                            연습 DB (NOARCHIVELOG)    운영 (ARCHIVELOG)
  redo size                       0.2 MB                47.9 MB
  undo change vector size         0.04 MB               0.04 MB
  physical writes direct          5,872                 5,872
  경과                            0.3 초                 2.8 초

[운영 딕셔너리]
  V$DATABASE    LOG_MODE = ARCHIVELOG · FORCE_LOGGING = NO
  USER_TABLES   T_ORD_BIG_BAK · LOGGING = YES

문제 ​

  1. 직접 경로로 적재됐는데도 운영 redo가 47.9MB인 이유와, 붙인 NOLOGGING이 아무 효과가 없는 이유를 설명하시오.
  2. 보관본 단계의 redo를 줄이도록 고치고, 그 대가와 미리 확인할 것을 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자