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

INSERT 한 문장에 329초, 일요일 밤 재적재가 아침 9시를 넘긴다

기초INSERT한빛유통429 / 700

상황 ​

일요일 22:00에 시작하는 야간 체인의 첫 단계는 T_ORD_BIG을 비우고 주문계 원천 100만 건을 다시 넣는다. 04:00 마감인데 이번 주는 09:12에 끝났다. 배치 담당 오과장: "10화 때 통계 수집 단계를 빼 봤는데도 안 줄었어요." 낮에는 정산 기간 조회(Q1)가 IX_ORD_BIG_DT_AMT를, 정산 목록 페이징(Q4)이 IX_ORD_BIG_DT_SEQ를 쓴다. IX_ORD_BIG_DT는 04화부터 '폐기 승인 대기'로 남아 있다.

테이블과 인덱스 ​

  • T_ORD_BIG: 1,000,000행 · 5,826블록. PK, FK, 트리거는 없고, 다른 세션은 체인이 끝난 뒤에 읽는다.
  • 인덱스 셋(갓 만든 크기, 리프 블록 수): IX_ORD_BIG_DT (ORD_DT) 2,653 · IX_ORD_BIG_DT_AMT (ORD_DT, ORD_AMT) 3,206 · IX_ORD_BIG_DT_SEQ (ORD_DT, ORD_SEQ) 3,344
  • ORD_ST에 FREQUENCY 히스토그램이 있다(10화 통계 정책서). 원천 STG_ORD_BIG은 100만 행이다(주문계에서 받아 둔 사본).
  • 연습 DB는 NOARCHIVELOG이고, 온라인 리두 로그는 10MB × 2다.

원본 SQL ​

sql
-- 일요일 22:00 · 체인 ① T_ORD_BIG 재적재 (오과장)
TRUNCATE TABLE T_ORD_BIG;

INSERT INTO T_ORD_BIG (ORD_SEQ, CUS_ID, ORD_DT, ORD_ST, ORD_AMT)
SELECT ORD_SEQ, CUS_ID, ORD_DT, ORD_ST, ORD_AMT
  FROM STG_ORD_BIG;
COMMIT;

EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T_ORD_BIG')

실행계획 실측 · 교재 14화(인덱스 사용 이력은 학습용 예시) ​

xplan
[단계별 — 연습 DB 복사본 · 인덱스 셋 켠 채 (교재 14화 실습/02 [A])]
  단계                     경과      redo        undo       db block changes   logical reads
  INSERT 100만 + COMMIT    329 초    916.6 MB    344.4 MB   5,455,266          7,949,703
    └ 그중 log file switch (checkpoint incomplete) 대기 309.5 초
  통계 수집                1.06 초     1.4 MB    0             15,617             37,327

[같은 5만 건 · 인덱스 개수만 바꿔 (교재 14화 실습/01)]
  인덱스                        redo        undo       db block changes
  0 개                           2.44 MB     0.13 MB        1,921
  1 개  (ORD_DT)                14.13 MB     4.34 MB      102,481
  2 개  +(ORD_DT, ORD_AMT)      26.09 MB     8.72 MB      201,060
  3 개  +(ORD_DT, ORD_SEQ)      38.55 MB    13.31 MB      301,704

[켠 채 일반 INSERT 로 채운 뒤의 인덱스 크기 (리프 블록)]
  IX_ORD_BIG_DT  2,653 → 4,374 · IX_ORD_BIG_DT_AMT  3,206 → 3,555 · IX_ORD_BIG_DT_SEQ  3,344 → 5,505

[인덱스 사용 이력 — DBA_INDEX_USAGE · 최근 30일]
  NAME                 TOTAL_ACCESS_COUNT   LAST_USED
  IX_ORD_BIG_DT                         0   —
  IX_ORD_BIG_DT_AMT                41,206   어제 17:52
  IX_ORD_BIG_DT_SEQ               318,440   어제 18:03

문제 ​

  1. 329초와 redo 916.6MB가 어디서 나오는지 위 표로 설명하시오.
  2. 낮의 조회를 죽이지 않으면서 재적재 시간을 줄이도록 배치를 고치시오. 인덱스 셋을 각각 어떻게 할지, 그렇게 판단한 근거와 대가도 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자