Skip to content
튜닝 연습파티션
PART-003

매달 한 달 치를 DELETE로 지우는데, 지운 칸이 그대로 무겁다

실전DDL버거378 / 700

상황 ​

매달 1일 03:00에 도는 「보관 기간 정리」 배치는 보관 규정 24개월이 지난 가장 오래된 달을 지운다. 배치 담당 오과장: "파티션 테이블인데 왜 DELETE하냐고 물었더니, 처음 만든 사람이 그렇게 했다고만 한다." 지운 뒤에도 전체 칸을 읽는 조회(분기 리포트 등)가 가벼워지지 않고, 정리하는 밤마다 redo가 20MB 넘게 아카이브로 나간다(운영은 ARCHIVELOG). 이번 달 정리 대상은 2012년 1월(P201201)이다.

테이블과 인덱스 ​

  • ORD_RANGE: 1,000,000행 · PARTITION BY RANGE (ORD_YM) 월별 25칸(P201201 ~ P201312 + 빈 P_DEFAULT (MAXVALUE)) · 칸 하나 약 16MB · FULL ≈ 1,980블록
  • 매일 밤 그날 주문이 적재된다. 2014년 1월 칸은 아직 없어서, 오늘(1월 1일) 밤 적재분부터 P_DEFAULT로 들어간다.
  • 2012년 1월은 42,408행이다.
  • LOCAL 인덱스 ORD_RANGE_PK (ORD_NO, ORD_YM) · ORD_RANGE_X01 (ORD_DT, ORD_HMS)
  • GLOBAL 유니크 인덱스 ORD_RANGE_GX01 (ORD_NO): 영수증 재조회용(하루 약 6만 번, 4블록)
  • 다른 테이블이 ORD_RANGE를 FK로 참조하지 않는다. 정리 시각에 다른 작업은 없다.

원본 SQL ​

sql
-- 매월 1일 03:00 · 보관 24 개월이 지난 달
DELETE FROM ORD_RANGE
 WHERE ORD_YM = '201201';
COMMIT;

실행계획 학습용 예시 · 교재 14화 규모 ​

xplan
[DELETE 계획 — 2012년 1월 한 칸]
------------------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name      | Starts | E-Rows | A-Rows |    A-Time   | Buffers | Pstart | Pstop |
------------------------------------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT         |           |      1 |        |      0 | 00:00:00.42 |    172K |        |       |
|   1 |  DELETE                  | ORD_RANGE |      1 |        |      0 | 00:00:00.42 |    172K |        |       |
|   2 |   PARTITION RANGE SINGLE |           |      1 |  42408 |  42408 | 00:00:00.02 |    1980 |      1 |     1 |
|*  3 |    TABLE ACCESS FULL     | ORD_RANGE |      1 |  42408 |  42408 | 00:00:00.02 |    1980 |      1 |     1 |
------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter("ORD_YM"='201201')

[세션 통계 — DELETE + COMMIT 한 번]
  지운 행                    42,408
  db block changes           약 170,000
  redo size                  약 26 MB
  undo change vector size    약 14 MB
  경과                       약 0.4 초

[정리 뒤 — 같은 칸 · 같은 테이블]
  SELECT COUNT(*) FROM ORD_RANGE PARTITION (P201201)    0 행 · Buffers 1,980 (그대로)
  P201201 세그먼트                                      16 MB (그대로)
  전체 칸을 읽는 조회 (분기 리포트 · SUBSTR 조건)        47,460 → 47,460

문제 ​

  1. 이 DELETE의 비용을 셋(행마다 하는 일, redo/undo, 공간)으로 나눠 위 숫자로 설명하고, 지운 칸이 왜 그대로 무거운지 쓰시오.
  2. 같은 정리를 파티션 DDL로 바꾸고, 글로벌 인덱스와 영수증 재조회가 어떻게 되는지 SQL과 함께 설명하시오.
  3. DROP과 TRUNCATE(보관이 필요할 때의 방법까지)를 비교하고, 파티션 DDL로 바꿀 때의 부작용과 확인할 것을 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자