테마
지난주 DBA가 T_ORD_BIG의 인덱스를 정리했다. 정리 기준은 이렇게 적혀 있다. "컬럼이 모두 다른 인덱스에 들어 있는 인덱스는 중복이다. (ORD_DT, ORD_AMT)의 두 컬럼은 (CUS_ID, ORD_DT, ORD_AMT)에 다 있으므로 지운다."
그 뒤로 정산 화면의 「기간 매출」(교재 02화에서 고친 그 조회, 하루 수천 번)이 느려졌다. 조민우는 "실행계획에 아직 인덱스 이름이 나오니 인덱스는 타고 있다"고 한다. 아래는 2024년 6월을 넘겼을 때다.
T_ORD_BIG: 1,000,000행 · 5,826블록 · ORD_DT 전부 자정 · 2024년 6월 27,390건 · CUS_ID 2,000명IX_ORD_BIG_CUS_DT_AMT (CUS_ID, ORD_DT, ORD_AMT): ACC-043에서 「고객별 주문 원장」용으로 만든 인덱스 · BLEVEL 2 · 리프 약 4,100블록 · 통계 최신IX_ORD_BIG_DT_AMT (ORD_DT, ORD_AMT): 리프 3,206블록(교재 04화 실측) · 같은 조회를 91블록에 끝냈다(교재 02화 실측)SELECT COUNT(*) AS ord_cnt, SUM(o.ORD_AMT) AS ord_amt
FROM T_ORD_BIG o
WHERE o.ORD_DT >= TO_DATE(:v_from, 'YYYYMMDD')
AND o.ORD_DT < TO_DATE(:v_to, 'YYYYMMDD') + 1
---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.09 | 4126 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.09 | 4126 |
|* 2 | FILTER | | 1 | | 27390 |00:00:00.09 | 4126 |
|* 3 | INDEX FAST FULL SCAN| IX_ORD_BIG_CUS_DT_AMT | 1 | 27390 | 27390 |00:00:00.08 | 4126 |
---------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(TO_DATE(:V_TO,'YYYYMMDD')+1>TO_DATE(:V_FROM,'YYYYMMDD'))
3 - filter(("O"."ORD_DT">=TO_DATE(:V_FROM,'YYYYMMDD') AND "O"."ORD_DT"<TO_DATE(:V_TO,'YYYYMMDD')+1))
INDEX FAST FULL SCAN과 인덱스의 선두 컬럼으로 설명하시오. 옵티마이저가 SKIP SCAN을 고르지 않은 이유도 설명하시오.