테마
재무팀의 「일별 매출 추이」는 기간을 고르면 일자별 주문 건수와 매출을 선 그래프로 그린다. 그래프 부품은 받은 행 순서대로 점을 잇는다. 한 달을 고를 때는 문제가 없었는데, 올해부터 1년을 고르기 시작하자 선이 앞뒤로 엉킨 그림이 나온다.
SQL에는 개발 당시의 주석 -- 인덱스가 날짜순이라 ORDER BY 는 뺐다 (정렬 비용 절약)이 남아 있다. 월간 메뉴와 연간 메뉴는 화면이 달라 커서도 따로 있다.
T_ORD_BIG: 1,000,000행 · 5,826블록 · ORD_DT 2022-01-01 ~ 2024-12-30(하루 913건, 전부 자정) · 2024년 6월 27,390건 · 2024년 333,245건(365일)IX_ORD_BIG_DT_AMT (ORD_DT, ORD_AMT): BLEVEL 2 · 리프 3,206블록(교재 04화 실측) · 통계 최신 · 다른 인덱스 없음db_file_multiblock_read_count = 128SELECT ORD_DT, COUNT(*) AS ord_cnt, SUM(ORD_AMT) AS ord_amt
FROM T_ORD_BIG
WHERE ORD_DT >= TO_DATE(:v_from, 'YYYYMMDD')
AND ORD_DT < TO_DATE(:v_to, 'YYYYMMDD') + 1
GROUP BY ORD_DT
-- 인덱스가 날짜순이라 ORDER BY 는 뺐다 (정렬 비용 절약)
[월간 메뉴 — 2024년 6월]
-----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 30 |00:00:00.01 | 91 |
| 1 | SORT GROUP BY NOSORT | | 1 | 30 | 30 |00:00:00.01 | 91 |
|* 2 | FILTER | | 1 | | 27390 |00:00:00.01 | 91 |
|* 3 | INDEX RANGE SCAN | IX_ORD_BIG_DT_AMT | 1 | 27390 | 27390 |00:00:00.01 | 91 |
-----------------------------------------------------------------------------------------------------
2 - filter(TO_DATE(:V_TO,'YYYYMMDD')+1>TO_DATE(:V_FROM,'YYYYMMDD'))
3 - access("ORD_DT">=TO_DATE(:V_FROM,'YYYYMMDD') AND "ORD_DT"<TO_DATE(:V_TO,'YYYYMMDD')+1)
[연간 메뉴 — 2024년]
----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Used-Mem |
----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 365 |00:00:00.12 | 3227 | |
| 1 | HASH GROUP BY | | 1 | 365 | 365 |00:00:00.12 | 3227 | 1489K (0)|
|* 2 | FILTER | | 1 | | 333K|00:00:00.09 | 3227 | |
|* 3 | INDEX FAST FULL SCAN| IX_ORD_BIG_DT_AMT | 1 | 334K| 333K|00:00:00.07 | 3227 | |
----------------------------------------------------------------------------------------------------------------
2 - filter(TO_DATE(:V_TO,'YYYYMMDD')+1>TO_DATE(:V_FROM,'YYYYMMDD'))
3 - filter(("ORD_DT">=TO_DATE(:V_FROM,'YYYYMMDD') AND "ORD_DT"<TO_DATE(:V_TO,'YYYYMMDD')+1))
[연간 메뉴 · INDEX_RS 힌트로 범위 스캔을 강제하면] 약 1,072블록 (리프 3,206 × 33.3% + 수직 탐색)