Skip to content
튜닝 연습인덱스 스캔 효율과 테이블 액세스
ACC-004

인덱스만 읽는 SQL인데 가맹점주 앱이 무겁다

중급SELECT버거79 / 700

상황 ​

버거원 가맹점주 앱의 「우리 매장 주문 추이」는 자기 매장의 최근 석 달 일별 주문 건수를 보여 준다. 가맹점 200곳이 하루에 수십 번씩 연다. 옵티마이저는 04화에서 월마감용으로 들인 커버링 인덱스 ORD_RANDOM_X02를 골랐고, 테이블에는 가지 않는다. 그런데 매장 하나의 641건을 세는 데 인덱스를 475블록이나 읽는다.

테이블과 인덱스 ​

  • ORD_RANDOM: 1,000,000행 · 22,414블록 · ORD_DT VARCHAR2(8) 2012 ~ 2013 · 한 달 약 41,666건 · SHOP_NO 'SH0001' ~ 'SH0200'(고르게 분포)
  • 2013년 10 ~ 12월: 약 125,000건 · 그중 매장 SH0042는 641건
  • 인덱스 ORD_RANDOM_X01 (ORD_DT, ORD_HMS) · ORD_RANDOM_X02 (ORD_DT, SHOP_NO): X02는 BLEVEL 2 · 리프 3,774 · 04화 T2 승인 뒤 VISIBLE · 월마감 「가맹점별 주문 건수」(ORD_DT BETWEEN … GROUP BY SHOP_NO, 한 달 160블록)가 쓴다

원본 SQL ​

sql
SELECT ORD_DT, COUNT(*) AS ord_cnt
  FROM ORD_RANDOM
 WHERE SHOP_NO = :v_shop
   AND ORD_DT BETWEEN :v_from AND :v_to
 GROUP BY ORD_DT
 ORDER BY ORD_DT

실행계획 학습용 예시 · 인덱스 규모는 교재 04화 실측 ​

xplan
---------------------------------------------------------------------------------------------------
| Id  | Operation             | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                |      1 |        |     92 |00:00:00.01 |     475 |
|   1 |  SORT GROUP BY NOSORT |                |      1 |     61 |     92 |00:00:00.01 |     475 |
|*  2 |   FILTER              |                |      1 |        |    641 |00:00:00.01 |     475 |
|*  3 |    INDEX RANGE SCAN   | ORD_RANDOM_X02 |      1 |     61 |    641 |00:00:00.01 |     475 |
---------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(:V_FROM<=:V_TO)
   3 - access("ORD_DT">=:V_FROM AND "SHOP_NO"=:V_SHOP AND "ORD_DT"<=:V_TO)
       filter("SHOP_NO"=:V_SHOP)

문제 ​

  1. 테이블에 가지도 않는데 인덱스를 475블록이나 읽는 이유를 Predicate Information의 3번 줄을 근거로 설명하시오.
  2. 이 SQL에 맞는 인덱스를 설계하고 DDL을 작성하시오. 그 인덱스를 X02를 바꿔서 만들지 하나 더 만들지, 월마감 SQL에 어떤 영향이 있는지까지 따져 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자