Skip to content
튜닝 연습소트 튜닝과 페이징
SORT-009

매장 상세에 「첫 판매일」 한 칸을 더했더니 3블록이던 조회가 305블록이 됐다

기초SELECT유통314 / 700

상황 ​

본사 매장 관리 화면 맨 위에는 '마지막 판매일'이 있다. 유통지원팀이 영업 기간을 한눈에 보고 싶다며 '첫 판매일'을 같이 보여 달라고 했고, 개발자는 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블록) · 통계 최신

원본 SQL ​

sql
SELECT MIN(SLE_DT) AS first_dt, MAX(SLE_DT) AS last_dt
  FROM CF10
 WHERE SHP_NO = :shp

실행계획 학습용 예시 ​

xplan
[지난달까지 : 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)

문제 ​

  1. MAX 하나일 때는 3블록이던 조회가 MIN을 더하자 305블록이 된 까닭을 두 실행계획의 차이로 설명하시오.
  2. 같은 결과를 돌려주면서 다시 몇 블록으로 끝나도록 SQL을 고치시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자