테마
본사 매장 관리 화면 맨 위에는 '마지막 판매일'이 있다. 유통지원팀이 영업 기간을 한눈에 보고 싶다며 '첫 판매일'을 같이 보여 달라고 했고, 개발자는 MAX만 있던 SQL에 MIN을 하나 더 넣었다.
화면은 여전히 빠르게 뜨지만, DBA가 이 SQL의 실행당 읽은 블록 수가 100배가 된 것을 찾아냈다. 매장 담당자들이 하루 3천 번쯤 연다.
CF10 판매: 500,000행 · 4,583블록 · SLE_DT VARCHAR2(8) '20220101' ~ '20231231' · 판매가 있는 매장 5곳(SHP_NO 1001 ~ 1005) · 매장마다 약 10만 건CF10_PK (SLE_NO), IX_CF10_SHP_DT (SHP_NO, SLE_DT): BLEVEL 2 · 리프 약 1,520블록(매장 하나에 약 300블록) · 통계 최신SELECT MIN(SLE_DT) AS first_dt, MAX(SLE_DT) AS last_dt
FROM CF10
WHERE SHP_NO = :shp
[지난달까지 : MAX 하나]
---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 3 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 3 |
| 2 | FIRST ROW | | 1 | 1 | 1 |00:00:00.01 | 3 |
|* 3 | INDEX RANGE SCAN (MIN/MAX)| IX_CF10_SHP_DT | 1 | 1 | 1 |00:00:00.01 | 3 |
---------------------------------------------------------------------------------------------------------
3 - access("SHP_NO"=:SHP)
[지금 : MIN 과 MAX]
---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.02 | 305 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.02 | 305 |
|* 2 | INDEX RANGE SCAN | IX_CF10_SHP_DT | 1 | 100K| 100K|00:00:00.02 | 305 |
---------------------------------------------------------------------------------------------------------
2 - access("SHP_NO"=:SHP)