테마
유통 본사의 「월 판매번호 목록」은 회계 연동용으로 한 달 치 판매번호와 판매일자를 내려준다. 지난주 외부 점검 보고서에 이런 줄이 있었다. "버거원에서 INDEX_JOIN으로 테이블 액세스를 없애 블록을 4분의 1로 줄였다. 같은 모양의 SQL에 적용을 권고한다." 조민우가 권고대로 힌트를 붙였는데, 이 SQL은 오히려 무거워졌다. 아래는 2023년 6월을 골랐을 때 힌트를 붙인 뒤와 붙이기 전이다.
CF10 판매: 500,000행 · 4,583블록(블록당 약 109행) · 판매 날짜순으로 적재 · 2023년 6월 20,953건(교재 03화 실측) · 컬럼은 모두 NOT NULLCF10_PK (SLE_NO): BLEVEL 2 · 리프 약 1,680블록 · IX_CF10_SLE_DT (SLE_DT): BLEVEL 2 · 리프 1,393블록 · CLUSTERING_FACTOR 9,921(교재 03화 실측) · 통계 최신ORD_RANDOM의 날짜 인덱스는 CLUSTERING_FACTOR가 999,958이다(행 수와 같다)SELECT /*+ INDEX_JOIN(a IX_CF10_SLE_DT CF10_PK) */
a.SLE_NO, a.SLE_DT
FROM CF10 a
WHERE a.SLE_DT BETWEEN :v_from AND :v_to
[힌트를 붙인 뒤]
---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Used-Mem |
---------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 20953 |00:00:00.09 | 1757 | |
|* 1 | FILTER | | 1 | | 20953 |00:00:00.09 | 1757 | |
|* 2 | VIEW | index$_join$_001 | 1 | 2094 | 20953 |00:00:00.08 | 1757 | |
|* 3 | HASH JOIN | | 1 | | 20953 |00:00:00.08 | 1757 | 2316K (0)|
|* 4 | INDEX RANGE SCAN | IX_CF10_SLE_DT | 1 | 2094 | 20953 |00:00:00.01 | 61 | |
| 5 | INDEX FAST FULL SCAN| CF10_PK | 1 | 2094 | 500K|00:00:00.05 | 1696 | |
---------------------------------------------------------------------------------------------------------------
1 - filter(:V_FROM<=:V_TO)
2 - filter(("SLE_DT">=:V_FROM AND "SLE_DT"<=:V_TO))
3 - access(ROWID=ROWID)
4 - access("SLE_DT">=:V_FROM AND "SLE_DT"<=:V_TO)
[힌트를 붙이기 전]
---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 20953 |00:00:00.03 | 477 |
|* 1 | FILTER | | 1 | | 20953 |00:00:00.03 | 477 |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED| CF10 | 1 | 2094 | 20953 |00:00:00.03 | 477 |
|* 3 | INDEX RANGE SCAN | IX_CF10_SLE_DT | 1 | 2094 | 20953 |00:00:00.01 | 61 |
---------------------------------------------------------------------------------------------------------
1 - filter(:V_FROM<=:V_TO)
3 - access("SLE_DT">=:V_FROM AND "SLE_DT"<=:V_TO)