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

건수는 그대로인데 1년 새 1.5배가 된 주문 이력, 보관 기간 단축도 DELETE 한 문장으로 올라왔다

실전DELETE한빛유통469 / 700

상황 ​

주문상태이력 T_ORD_LOG는 매일 밤 그날 이력을 더하고, 매달 첫 일요일에 가장 오래된 한 달을 지운다. 보관 기간이 900일이라 건수는 50만 행 안팎에서 그대로인데, 1년 새 테이블이 1.5배가 됐고 상담 화면의 이력 집계도 그만큼 느려졌다. 이번 달에는 보관 기간을 900일에서 365일로 줄이라는 지침이 내려왔고, 개발팀은 DELETE 한 문장을 올렸다. 박팀장: "세 작업을 각각 어떻게 할지 숫자와 함께 정리해 주세요."

테이블과 인덱스 ​

  • T_ORD_LOG 주문상태이력(교재 05화 생성식): LOG_ID · ORD_SEQ · LOG_DT DATE · LOG_ST · LOG_MSG · LOG_DTL · 500,214행 · 하루 약 555행이 LOG_DT 순으로 쌓인다(블록당 약 139행) · 인덱스 IX_ORD_LOG_SEQ (ORD_SEQ) 하나(상담 화면용) · FK와 트리거는 없다.
  • 처음 지었을 때는 3,602블록이었다. 지금 USER_TABLES.BLOCKS는 5,514이고, 그중 행이 하나도 없는 블록이 약 1,600개다(지난 13개월에 지운 달들의 자리).
  • T_ORD_LOG_STG: 그날 상태 변경 이력, 약 555행. 주문계에서 받는다.
  • 상담 화면(09:00 ~ 18:00)은 T_ORD_LOG를 읽기만 하고, 쓰는 것은 야간 배치뿐이다. 일요일 22:00 ~ 04:00에 체인 작업 창이 있다.
  • 파티셔닝은 유상 옵션이라 아직 승인받지 못했다(2021년 강도현 커밋).

원본 SQL ​

sql
-- (가) 매일 23:00 · 그날 이력 더하기
INSERT /*+ APPEND */ INTO T_ORD_LOG
SELECT * FROM T_ORD_LOG_STG;
COMMIT;

-- (나) 매달 첫 일요일 · 가장 오래된 한 달 지우기
DELETE FROM T_ORD_LOG
 WHERE LOG_DT < TRUNC(SYSDATE) - 900;
COMMIT;

-- (다) 이번 한 번 · 보관 기간 900일 → 365일 (개발팀 제출)
DELETE FROM T_ORD_LOG
 WHERE LOG_DT < TRUNC(SYSDATE) - 365;
COMMIT;

실행계획 학습용 예시 · (나)의 숫자는 교재 14화 실측 ​

xplan
[(나) 지난달 — DELETE 한 달 (교재 14화 실측 · 17,235행 · 인덱스 1개)]
  redo size                  4.84 MB
  undo change vector size    2.32 MB
  db block changes           36,691
  경과                       0.06 초
  그 뒤 전체 스캔            그대로 (고수위선 아래 블록은 줄지 않는다)

[T_ORD_LOG 크기 — 지난 13개월 (USER_TABLES · 매달 첫 일요일 수집)]
  시점        NUM_ROWS    BLOCKS   상담 화면 이력 집계(FULL) Buffers
  작년 11월    500,000     3,602    3,606
  올해 5월     500,301     4,566    4,570
  이번 달      500,214     5,514    5,518

[(다) 개발팀 추정 — 지울 행 296,925 (59%) · 한 달 실측의 17.2배로 어림]
  redo 약 83 MB · undo 약 40 MB · db block changes 약 63만 · 고수위선 5,514 그대로

문제 ​

  1. 건수가 그대로인데 테이블이 3,602블록에서 5,514블록으로 커진 이유를 (가)와 (나)의 조합으로 설명하시오.
  2. (가), (나), (다)를 각각 어떻게 처리할지 SQL로 작성하고, 고른 근거를 넣거나 지울 행의 비율과 위 숫자로 쓰시오.
  3. (다)를 처리하는 동안과 처리한 뒤에 확인해야 할 것과 그 방법의 대가를 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자