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

15분 칸마다 한 단계씩 띄우는 월초 체인에서 등급 재산정이 칸을 넘기자 월 보정이 옛 등급으로 돌았다

실전PLSQL한빛유통494 / 700

상황 ​

한빛유통의 월초 체인은 매달 1일 05:00부터 15분 간격으로 단계 여덟 개를 하나씩 띄운다. 2019년에 단계마다 스케줄러 작업을 따로 만들고 시작 시각을 박아 둔 구조다. 마감은 07:00(정산팀 출근과 정산 화면 오픈)이고, 끝나는 시각은 늘 06:51 무렵이라 '여유 9분'으로 관리해 왔다. 11월 1일에는 S5(고객 등급 재산정)가 고객 정보 화면이 잡고 있던 행 잠금을 15분 기다려 06:15:41에 끝났다. S6(월 보정)은 06:15:00에 정해진 대로 시작했고, 11월 3일 정산팀이 등급이 바뀐 고객 214명의 10월 보정액이 옛 등급 보정률로 DW에 넘어간 것을 찾아냈다. 박팀장: "시간이 모자라서가 아니라는데, 그럼 뭐가 문제입니까? 숫자로 정리해 주세요."

테이블과 인덱스 ​

  • T_ORD_BIG 1,000,000행 · 5,826블록 · T_ORD 100,000행 · 896블록 · T_ORD_STLM 100,000행 · 640블록 · M_CUS 2,000행 · 30블록 · T_ITM_EVL 5,000행 · 48블록
  • 단계마다 읽고 쓰는 테이블과 11월 1일 실행 기록은 실행계획 칸에 있다. 단계 하나하나는 이미 고친 판(14화 이후)이다.
  • 서버는 CPU 8개이고 월초 05:00 ~ 07:00에 다른 배치는 없다. 정산 화면은 07:00 전에는 쓰지 않는다.
  • 단계를 담은 프로그램 PRG_S1 ~ PRG_S8이 스케줄러에 등록되어 있다.

원본 SQL ​

sql
-- 2019년 등록 · 단계마다 작업 하나, 시작 시각 고정 (S1 05:00, S2 05:15, … S8 06:45)
BEGIN
  DBMS_SCHEDULER.CREATE_JOB(job_name => 'JOB_MON_S1', program_name => 'PRG_S1',
                            repeat_interval => 'FREQ=MONTHLY;BYMONTHDAY=1;BYHOUR=5;BYMINUTE=0',  enabled => TRUE);
  DBMS_SCHEDULER.CREATE_JOB(job_name => 'JOB_MON_S2', program_name => 'PRG_S2',
                            repeat_interval => 'FREQ=MONTHLY;BYMONTHDAY=1;BYHOUR=5;BYMINUTE=15', enabled => TRUE);
  DBMS_SCHEDULER.CREATE_JOB(job_name => 'JOB_MON_S3', program_name => 'PRG_S3',
                            repeat_interval => 'FREQ=MONTHLY;BYMONTHDAY=1;BYHOUR=5;BYMINUTE=30', enabled => TRUE);
  -- … S4 05:45 · S5 06:00 · S6 06:15 · S7 06:30
  DBMS_SCHEDULER.CREATE_JOB(job_name => 'JOB_MON_S8', program_name => 'PRG_S8',
                            repeat_interval => 'FREQ=MONTHLY;BYMONTHDAY=1;BYHOUR=6;BYMINUTE=45', enabled => TRUE);
END;

실행계획 학습용 예시 ​

xplan
[11월 1일 — 스케줄러 실행 기록]
  단계  하는 일              정해진 시작  끝         경과       읽는 것 → 쓰는 것
  S1    T_ORD_BIG 재적재      05:00       05:01:10   1분 10초   STG_ORD_BIG → T_ORD_BIG
  S2    T_ORD_BIG 통계 수집    05:15       05:15:50   0분 50초   T_ORD_BIG
  S3    정산 적재 P1          05:30       05:30:20   0분 20초   T_ORD → T_ORD_STLM
  S4    월마감 집계           05:45       05:47:30   2분 30초   T_ORD_BIG → T_MON_SUM
  S5    고객 등급 재산정       06:00       06:15:41  15분 41초   T_ORD_BIG → M_CUS     (평소 0분 40초 · 이날 enq: TX 15분)
  S6    월 보정               06:15       06:15:20   0분 20초   T_ORD_STLM · M_CUS → T_STLM_ADJ
  S7    상품평가 요약          06:30       06:30:05   0분 05초   T_ITM_EVL → T_ITM_EVL_SUM
  S8    DW 전송               06:45       06:51:00   6분 00초   T_MON_SUM · T_ORD_STLM · T_STLM_ADJ → DW
  마감 07:00 · 끝 06:51:00 · 여유 9분 · 실패한 단계 0

[10월 1일 — 평소] 모든 단계가 위와 같고 S5 0분 40초 · 끝 06:51:00

[11월 3일 정산팀 확인]
  등급이 바뀐 고객 214명 · 10월 보정이 옛 등급 보정률로 계산됨 · DW 에 그대로 넘어감

문제 ​

  1. 11월 1일 기록으로 체인이 실제로 일한 시간과 걸린 시간을 숫자로 비교하고, 월 보정이 옛 등급으로 돈 이유를 설명하시오. '여유 9분'이라는 관리 지표가 무엇을 놓쳤는지도 쓰시오.
  2. 단계마다 읽고 쓰는 테이블로 선후 관계를 정하고, 체인이 가장 일찍 끝나는 경로(임계 경로)와 그때의 끝 시각, 여유를 구하시오. 11월 1일처럼 S5가 15분 41초 걸리면 끝 시각이 언제가 되는지도 구하시오.
  3. 시각이 아니라 선후 관계로 단계를 띄우도록 체인을 다시 작성하시오. 함께 도는 단계가 생기는 데 따른 부작용과, 단계가 실패했을 때의 동작도 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자