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

인덱스는 있는데 기간 조회가 FULL로 돈다

기초SELECT한빛유통01 / 700

상황 ​

정산 화면의 「기간 매출」 조회는 하루에 수천 번 호출된다. 개발팀은 이렇게 말한다. "ORD_DT에 인덱스를 만들었는데 안 빨라졌다." 화면은 'YYYYMMDD' 형식의 문자열 두 개(:v_from, :v_to)를 넘긴다. 아래는 2024년 6월 한 달을 넘겼을 때의 실행계획이다.

테이블과 인덱스 ​

  • T_ORD_BIG: 1,000,000행 · 5,826블록 · ORD_DT는 DATE(전부 자정, 시분초 없음) · 6월 한 달 27,390행
  • 인덱스 IX_ORD_BIG_DT (ORD_DT): 이미 있다 · 통계 최신

원본 SQL ​

sql
SELECT COUNT(*), SUM(ORD_AMT)
  FROM T_ORD_BIG
 WHERE TO_CHAR(ORD_DT, 'YYYYMMDD') BETWEEN :v_from AND :v_to

실행계획 실측 · 교재 02화 ​

xplan
Plan hash value: 914281838

------------------------------------------------------------------------------------------
| Id  | Operation          | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |           |      1 |        |      1 |00:00:00.11 |    5826 |
|   1 |  SORT AGGREGATE    |           |      1 |      1 |      1 |00:00:00.11 |    5826 |
|*  2 |   TABLE ACCESS FULL| T_ORD_BIG |      1 |   2500 |  27390 |00:00:00.11 |    5826 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter((TO_CHAR(INTERNAL_FUNCTION("ORD_DT"),'YYYYMMDD')>=:V_FROM AND
              TO_CHAR(INTERNAL_FUNCTION("ORD_DT"),'YYYYMMDD')<=:V_TO))

문제 ​

  1. 인덱스가 있는데도 TABLE ACCESS FULL로 처리되는 이유를 실행계획의 어느 줄에서 알 수 있는지 설명하시오.
  2. 결과가 바뀌지 않게 SQL을 고쳐 인덱스 범위 스캔이 되도록 하시오. 읽는 양을 더 줄일 수 있다면 인덱스 설계도 제안하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자