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

2년 치 주문을 지웠는데 전체 조회는 그대로 22,422블록

실전DELETE버거428 / 700

상황 ​

무대는 버거원 POS 본사 DB다. 2012 ~ 2013년 두 해의 주문을 DW로 이관했고, 운영에는 2013년 12월 한 달만 남기기로 했다(매장 화면은 이번 달만 본다). 개발팀이 토요일 밤에 반영할 작업을 넘겼고, 테스트 DB에서 ORD 쪽을 먼저 돌려 봤다. 매장 정산 담당: "지운 뒤에 매장별 집계 화면을 눌러 봤는데 하나도 안 빨라졌어요." 반영 창은 토요일 23:00 ~ 01:00이고, 그 시간에는 매장 영업이 없다. 앞으로 매달 지난달을 이관하고 지울 계획이다.

테이블과 인덱스 ​

  • ORD 주문: 1,000,000행 · 22,422블록 · ORD_DT VARCHAR2(8) '20120101' ~ '20131231' · 날짜순 적재 · 2013년 12월 42,408행(4.2%)
  • 인덱스는 ORD_PK (ORD_NO)와 ORD_X01 (ORD_DT, ORD_HMS)이다. ORD를 가리키는 FK는 없다. POS 연동 계정 POS_IF에 SELECT와 INSERT 권한이 있다.
  • ORD_ITEM 주문상품: 2,472,717행 · 55,265블록. 같은 방식으로 지운다(12월분 약 10만 행).
  • 매장별 집계 화면은 SELECT SHOP_NO, COUNT(*) FROM ORD GROUP BY SHOP_NO다(인덱스 없이 FULL).
  • 파티션 옵션은 있다(14화의 ORD_RANGE가 월별 파티션 복사본이다).

원본 SQL ​

sql
-- 토요일 23:00 반영 예정 (개발팀)
DELETE FROM ORD      WHERE ORD_DT < '20131201';
DELETE FROM ORD_ITEM WHERE ORD_DT < '20131201';
COMMIT;

실행계획 학습용 예시 ​

xplan
[세션 통계 — 테스트 DB · DELETE FROM ORD WHERE ORD_DT < '20131201' 한 번 · 인덱스 2개]
  경과 시간                  7분 12초 (그중 대부분이 리두 로그 교체 대기)
  삭제 행                    957,592
  session logical reads      약 6,700,000
  db block changes           약 5,700,000
  redo size                  약 740 MB
  undo change vector size    약 360 MB
  user commits               1

-------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT   |      |      1 |        |      0 |00:07:11.84 |   6702K |
|   1 |  DELETE            | ORD  |      1 |        |      0 |00:07:11.84 |   6702K |
|*  2 |   TABLE ACCESS FULL| ORD  |      1 |    957K|    957K|00:00:00.61 |   22422 |
-------------------------------------------------------------------------------------
   2 - filter("ORD_DT"<'20131201')

[매장별 집계 화면 — 같은 문장 · 지우기 전과 뒤 (통계는 지운 뒤 다시 모았다)]
                 TABLE ACCESS FULL A-Rows    Buffers    USER_TABLES
  지우기 전      1,000,000                   22,426     NUM_ROWS 1,000,000 · BLOCKS 22,422
  DELETE 뒤         42,408                   22,426     NUM_ROWS    42,408 · BLOCKS 22,422

문제 ​

  1. 이 DELETE의 비용(redo, undo, 시간)이 행마다 무엇을 쓰는 데서 나오는지 쓰고, 지운 뒤에도 집계 화면이 22,426블록인 이유를 설명하시오.
  2. 같은 결과(12월분만 남는다)를 내는 다른 방법을 SQL로 순서대로 작성하시오. 그 방법에서 원래 테이블로부터 '따라오지 않는 것'과 작업 창 동안 멈춰야 하는 것도 적으시오.
  3. 앞으로 매달 반복한다면 무엇을 바꿀지 제안하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자