테마
고객센터 상담 화면에 「고객 주문 상태 요약」을 새로 붙였다. 고객 번호 하나로 상태별 주문 건수를 보여 주며, 상담원들이 하루 3,000번쯤 연다.
개발자는 고객으로 찾는 인덱스가 없다는 것을 알고 기존 인덱스에 INDEX_SS 힌트를 붙였다. 메모에는 이렇게 적혀 있다. "선두 ORD_ST는 3종뿐이라 SKIP SCAN이면 세 번만 찾아간다. 인덱스를 새로 만들 필요 없음." 그런데 한 번에 4,412블록을 읽는다. 박팀장은 대안을 비교해 오라고 했다.
T_ORD_BIG: 1,000,000행 · 5,826블록 · ORD_DT 1,095일(하루 913건) · ORD_ST COMPLETE 90% · PENDING 8% · CANCEL 2% · CUS_ID 2,000명(고객당 500건)IX_ORD_BIG_ST_DT_CUS (ORD_ST, ORD_DT, CUS_ID): ACC-001의 (ORD_ST, ORD_DT)에 CUS_ID를 덧붙인 인덱스 · BLEVEL 2 · 리프 약 4,350블록(리프 한 블록에 약 230항목) · 통계 최신 · 「취소 추이」(ORD_ST = 'CANCEL' AND ORD_DT 범위)와 「상태별 일 고객 목록」(ORD_ST = :st AND ORD_DT = :d)이 쓴다IX_ORD_BIG_DT_AMT (ORD_DT, ORD_AMT)뿐이다 · 주문은 운영에서 계속 INSERT된다(교재 04화 실측: 인덱스 하나에 5만 건당 redo 약 11.8MB)SELECT /*+ INDEX_SS(o IX_ORD_BIG_ST_DT_CUS) */
o.ORD_ST, COUNT(*) AS ord_cnt
FROM T_ORD_BIG o
WHERE o.CUS_ID = :v_cus
GROUP BY o.ORD_ST
-------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.05 | 4412 |
| 1 | SORT GROUP BY NOSORT| | 1 | 3 | 1 |00:00:00.05 | 4412 |
|* 2 | INDEX SKIP SCAN | IX_ORD_BIG_ST_DT_CUS | 1 | 500 | 500 |00:00:00.05 | 4412 |
-------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("O"."CUS_ID"=:V_CUS)
filter("O"."CUS_ID"=:V_CUS)
[같은 SQL · 힌트를 떼면] TABLE ACCESS FULL 5,826