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

매일 밤 4만 6천 행만 다시 채우는 작업 테이블을 읽는 데 아직도 8천 블록이 든다

기초DELETE유통457 / 700

상황 ​

본사 레거시 유통의 「매장 상품 일 판매 집계」 배치는 매일 01:00에 작업 테이블 CF11_WRK를 비우고 최근 30일 판매상품을 다시 채운 뒤 매장별 상품 집계를 뽑는다. 작업 테이블에 들어가는 행은 매일 4만 6천 행 안팎이다. 배치 담당 오과장: "지난달 말에 연간 재집계를 한 번 돌린 뒤로 집계 단계가 느려졌어요. 행 수는 그대로인데요." 통계는 매일 다시 모은다.

테이블과 인덱스 ​

  • CF11_WRK 작업 테이블(문제 설정, CF10과 CF11을 조인한 사본): SLE_DT · SHP_NO · SLE_NO · ITM_NO · SLE_QTY · SLE_UPRC. 블록당 약 135행이 들어간다. 인덱스, 제약, 트리거는 없고 이 배치만 쓴다.
  • 지난달 말(10월 31일) 연간 재집계 때 판매상품 약 110만 행을 이 테이블에 한 번 넣었다가 다음 날 지웠다.
  • CF10 판매: 500,000행 · 4,583블록 · SLE_DT VARCHAR2(8) '20220101' ~ '20231231' · 하루 약 700건 · IX_CF10_SLE_DT (SLE_DT)
  • CF11 판매상품: 1,096,708행 · 8,204블록 · CF11_PK (SLE_NO, ITM_NO) · 판매 한 건에 평균 2.2행
  • 배치 계정이 CF11_WRK의 소유자다. 다른 테이블이 CF11_WRK를 참조하지 않는다.

원본 SQL ​

sql
-- 매일 01:00 · ① 작업 테이블 다시 채우기
DELETE FROM CF11_WRK;

INSERT INTO CF11_WRK (SLE_DT, SHP_NO, SLE_NO, ITM_NO, SLE_QTY, SLE_UPRC)
SELECT h.SLE_DT, h.SHP_NO, d.SLE_NO, d.ITM_NO, d.SLE_QTY, d.SLE_UPRC
  FROM CF10 h, CF11 d
 WHERE d.SLE_NO = h.SLE_NO
   AND h.SLE_DT BETWEEN :v_from AND :v_to;          -- 최근 30일
COMMIT;

-- ② 매장별 상품 집계
SELECT SHP_NO, ITM_NO, SUM(SLE_QTY) AS QTY, SUM(SLE_QTY * SLE_UPRC) AS AMT
  FROM CF11_WRK
 GROUP BY SHP_NO, ITM_NO;

실행계획 학습용 예시 ​

xplan
[① DELETE FROM CF11_WRK — 오늘 밤 · 세션 통계]
  지운 행                     46,180
  redo size                   약 9.1 MB
  undo change vector size     약 5.7 MB
  db block changes            약 93,000
  경과                        1.4 초

[CF11_WRK — USER_TABLES (매일 수집)]
  시점                     NUM_ROWS     BLOCKS (고수위선 아래)
  10월 27일 (재집계 전)       45,902        342
  10월 31일 (재집계 직후)  1,096,708      8,236
  11월 29일 (오늘)            46,180      8,236

[② 매장별 상품 집계 — 오늘]
-------------------------------------------------------------------------------------
| Id  | Operation          | Name     | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |          |      1 |        |    535 |00:00:00.19 |    8240 |
|   1 |  HASH GROUP BY     |          |      1 |    535 |    535 |00:00:00.19 |    8240 |
|   2 |   TABLE ACCESS FULL| CF11_WRK |      1 |  46180 |  46180 |00:00:00.15 |    8240 |
-------------------------------------------------------------------------------------
  (10월 27일 같은 문장: Buffers 346)

문제 ​

  1. 행 수는 그대로인데 ② 집계가 346블록에서 8,240블록으로 늘어난 이유를 설명하시오.
  2. ① 단계를 고치고, 고친 방법의 대가(쓸 수 없는 경우와 주의할 점)를 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자