테마
야간 배치가 채우는 정산 테이블 T_ORD_STLM에는 인덱스가 하나도 없었다. 고객센터가 「고객 정산 내역」(고객 한 명의 석 달 치)을 쓰기 시작하자 조민우가 첫 인덱스를 만들었다. "범위 스캔을 하려면 범위 조건 컬럼이 맨 앞에 있어야 한다." 그래서 (STLM_DT, CUS_ID) 순서로 만들었다.
상담원 서른 명이 하루 6천 번쯤 연다. 아래는 고객 CUS_000123의 2024년 2분기다.
T_ORD_STLM 정산: 100,000행 · 640블록 · 정산 배치가 매일 밤 비우고(TRUNCATE) T_ORD에서 직접 경로(APPEND)로 다시 채운다 · STLM_DT DATE(시분초 있음, 2023 ~ 2024, 하루 약 137건) · 고객당 50건IX_STLM_DT_CUS (STLM_DT, CUS_ID): BLEVEL 1 · 리프 약 392블록(리프 한 블록에 약 255항목) · CLUSTERING_FACTOR 약 100,000 · 통계 최신CREATE INDEX IX_STLM_DT_CUS ON T_ORD_STLM (STLM_DT, CUS_ID);
SELECT STLM_SEQ, ORD_SEQ, STLM_DT, STLM_AMT
FROM T_ORD_STLM
WHERE CUS_ID = :v_cus
AND STLM_DT >= TO_DATE(:v_from, 'YYYYMMDD')
AND STLM_DT < TO_DATE(:v_to, 'YYYYMMDD') + 1
ORDER BY STLM_DT;
-------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 6 |00:00:00.01 | 56 |
|* 1 | FILTER | | 1 | | 6 |00:00:00.01 | 56 |
| 2 | TABLE ACCESS BY INDEX ROWID| T_ORD_STLM | 1 | 6 | 6 |00:00:00.01 | 56 |
|* 3 | INDEX RANGE SCAN | IX_STLM_DT_CUS | 1 | 6 | 6 |00:00:00.01 | 50 |
-------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TO_DATE(:V_TO,'YYYYMMDD')+1>TO_DATE(:V_FROM,'YYYYMMDD'))
3 - access("STLM_DT">=TO_DATE(:V_FROM,'YYYYMMDD') AND "CUS_ID"=:V_CUS AND "STLM_DT"<TO_DATE(:V_TO,'YYYYMMDD')+1)
filter("CUS_ID"=:V_CUS)