Skip to content
튜닝 연습인덱스 사용 조건
IDX-009

고액 주문 알림이 1분마다 인덱스를 통째로 읽는다

기초SELECT한빛유통09 / 700

상황 ​

리스크팀 모니터의 「고액 주문」 칸은 부가세를 포함한 금액이 기준(:v_min, 지금은 539,000원) 이상인 주문의 건수와 합계를 띄운다. 화면 여섯 대가 1분마다 새로 고친다. 조민우가 지난주 ORD_AMT에 인덱스를 만들었고, 실행계획에도 그 인덱스 이름이 나온다. 그런데 한 번에 2천 블록이 넘는다. "인덱스는 탔는데 왜 이렇게 많이 읽죠?"

테이블과 인덱스 ​

  • T_ORD_BIG: 1,000,000행 · 5,826블록 · ORD_AMT는 부가세 별도 금액(10,000 ~ 500,000원, 100원 단위로 고르게 퍼져 있다) · NOT NULL 제약은 없지만 NULL은 0건
  • 부가세 포함 539,000원 이상, 즉 ORD_AMT 490,000원 이상인 주문: 20,512건(2.05%)
  • 인덱스 IX_ORD_BIG_AMT (ORD_AMT): 지난주 생성 · BLEVEL 2 · 리프 2,094블록 · 통계 최신

원본 SQL ​

sql
SELECT COUNT(*) AS cnt, SUM(ORD_AMT * 1.1) AS amt_vat
  FROM T_ORD_BIG
 WHERE ORD_AMT * 1.1 >= :v_min

실행계획 학습용 예시 ​

xplan
-------------------------------------------------------------------------------------------------
| Id  | Operation             | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                |      1 |        |      1 |00:00:00.08 |    2104 |
|   1 |  SORT AGGREGATE       |                |      1 |      1 |      1 |00:00:00.08 |    2104 |
|*  2 |   INDEX FAST FULL SCAN| IX_ORD_BIG_AMT |      1 |  50000 |  20512 |00:00:00.07 |    2104 |
-------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter("ORD_AMT"*1.1>=:V_MIN)

문제 ​

  1. 실행계획에 인덱스가 나오는데도 2,104블록을 읽는 이유를 INDEX FAST FULL SCAN과 Predicate Information으로 설명하시오.
  2. 결과가 바뀌지 않게 SQL을 고쳐 기준 이상인 범위만 읽도록 하시오. SELECT 절의 ORD_AMT * 1.1도 고쳐야 하는지 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자