테마
버거원 본사의 월마감 화면 「가맹점별 주문 건수」가 다시 느려졌다. 2년 전 외부 점검 보고서(강도현)에는 "ORD_DT 선두 인덱스 RANGE SCAN으로 변경 완료" 한 줄만 있고 숫자가 없다. 1년 전에는 서버를 바꾸면서 주문을 다시 적재했다.
운영본은 ORD_RANDOM이고, 이관 전 보관본은 ORD다. 같은 SQL을 테이블 이름만 바꿔 양쪽에서 쟀다. 박팀장은 이렇게 주문했다. "월말에 본사 전 부서가 이 화면을 연다. 무엇을 할지, 대가까지 적어 와라."
ORD_RANDOM(운영본): 1,000,000행 · 22,414블록 · 서버 교체 때 ORDER BY 없이 다시 적재ORD(이관 전 보관본): 1,000,000행 · 22,422블록 · 주문 시각 순으로 쌓였다 · 내용은 ORD_RANDOM과 같다ORD_DT VARCHAR2(8) '20120101' ~ '20131231' · 한 달 약 41,666건(4.17%) · SHOP_NO 200개 매장ORD_RANDOM_X01 (ORD_DT, ORD_HMS) · ORD_X01 (ORD_DT, ORD_HMS): 정의가 같다 · 통계 최신SELECT /*+ INDEX(o ORD_RANDOM_X01) */
o.SHOP_NO, COUNT(*) AS ord_cnt
FROM ORD_RANDOM o
WHERE o.ORD_DT BETWEEN '20120101' AND '20120131'
GROUP BY o.SHOP_NO
[ORD_RANDOM — 운영본]
-----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 200 |00:00:00.05 | 41825 |
| 1 | HASH GROUP BY | | 1 | 200 | 200 |00:00:00.05 | 41825 |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED| ORD_RANDOM | 1 | 4065 | 41666 |00:00:00.04 | 41825 |
|* 3 | INDEX RANGE SCAN | ORD_RANDOM_X01 | 1 | 4065 | 41666 |00:00:00.01 | 160 |
-----------------------------------------------------------------------------------------------------------------
3 - access("O"."ORD_DT">='20120101' AND "O"."ORD_DT"<='20120131')
[ORD — 이관 전 보관본 · 같은 SQL (힌트의 인덱스 이름만 ORD_X01)]
-----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 200 |00:00:00.02 | 1086 |
| 1 | HASH GROUP BY | | 1 | 200 | 200 |00:00:00.02 | 1086 |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED| ORD | 1 | 4065 | 41666 |00:00:00.02 | 1086 |
|* 3 | INDEX RANGE SCAN | ORD_X01 | 1 | 4065 | 41666 |00:00:00.01 | 160 |
-----------------------------------------------------------------------------------------------------------------
3 - access("O"."ORD_DT">='20120101' AND "O"."ORD_DT"<='20120131')
[같은 조건 · FULL 강제] ORD_RANDOM 22,234 · ORD 22,239
[딕셔너리 — USER_INDEXES]
INDEX_NAME BLEVEL LEAF_BLOCKS NUM_ROWS DISTINCT_KEYS CLUSTERING_FACTOR
---------------- ------ ----------- ---------- ------------- -----------------
ORD_RANDOM_X01 2 3774 1000000 986510 999958
ORD_X01 2 3774 1000000 986510 22223
ALTER INDEX … REBUILD가 처방이 아닌 이유도 설명하시오.