테마
매달 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블록P_DEFAULT로 들어간다.ORD_RANGE_PK (ORD_NO, ORD_YM) · ORD_RANGE_X01 (ORD_DT, ORD_HMS)ORD_RANGE_GX01 (ORD_NO): 영수증 재조회용(하루 약 6만 번, 4블록)ORD_RANGE를 FK로 참조하지 않는다. 정리 시각에 다른 작업은 없다.-- 매월 1일 03:00 · 보관 24 개월이 지난 달
DELETE FROM ORD_RANGE
WHERE ORD_YM = '201201';
COMMIT;
[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