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

10만 건을 한 건씩 넣고 1,000건마다 커밋하는 정산 적재

중급PLSQL한빛유통426 / 700

상황 ​

야간 정산 배치의 적재 단계에서는 주문 10만 건을 정산 테이블로 옮긴다. 배치 담당 오과장: "04시 마감인데 다른 단계와 겹치면 넘긴다." 소스의 커밋 줄 옆에는 -- 트랜잭션은 짧게 (2020.07 강도현)라는 주석이 있다. 그해 7월 언두 공간 부족 장애 뒤에 넣은 줄이다.

테이블과 인덱스 ​

  • T_ORD(원천): 100,000행 · 896블록
  • T_ORD_STLM(대상): 배치를 시작할 때마다 비운다(TRUNCATE). 인덱스는 없고, 다른 세션은 배치가 끝난 뒤에 읽는다.
  • DB는 NOARCHIVELOG다.

원본 SQL ​

sql
PROCEDURE P1_LOAD(p_limit NUMBER DEFAULT 100000) IS
  n NUMBER := 0;
BEGIN
  EXECUTE IMMEDIATE 'TRUNCATE TABLE T_ORD_STLM';
  FOR r IN (SELECT ORD_SEQ, CUS_ID, ORD_DT, ORD_AMT
              FROM T_ORD
             WHERE ROWNUM <= p_limit) LOOP
    n := n + 1;
    INSERT INTO T_ORD_STLM (STLM_SEQ, ORD_SEQ, CUS_ID, STLM_DT, STLM_AMT)
    VALUES (n, r.ORD_SEQ, r.CUS_ID, r.ORD_DT, r.ORD_AMT);
    IF MOD(n, 1000) = 0 THEN COMMIT; END IF;   -- 트랜잭션은 짧게 (2020.07 강도현)
  END LOOP;
  COMMIT;
END;

실행계획 실측 · 교재 18화(복사본, 세션 통계) ​

xplan
[세션 통계 — P1_LOAD(100000) 한 번]
  경과 시간                 850 ~ 1,010 ms
  CPU used by this session  430 ~ 470 ms
  session logical reads     110,130 ~ 110,420
  redo size                 28.6 MB
  undo change vector size   6.5 MB
  user commits              101
  INSERT 실행 횟수          100,000

[TKPROF 모양 — 루프 안의 INSERT]
INSERT INTO T_ORD_STLM (STLM_SEQ, ORD_SEQ, CUS_ID, STLM_DT, STLM_AMT) VALUES (:B5, :B4, :B3, :B2, :B1)
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Execute 100000      (CPU 의 대부분)              0      (적음)   (대부분)     100000

문제 ​

  1. 이 배치의 일량이 어디서 나오는지 실행 횟수, 논리 읽기, redo, 커밋으로 나눠 설명하시오.
  2. 같은 결과(정산 번호 1 ~ 100,000 포함)를 내도록 배치를 고치고, 1,000건 커밋이 그때 왜 들어갔으며 지금은 어떻게 할지 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자