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

하루치 판매 700건을 세는 「일별 판매 건수」가 1초 가까이 걸린다

기초SELECT유통02 / 700

상황 ​

본사 레거시 유통의 「일별 판매 건수」 화면은 하루치 판매 건수 하나를 세는데, 1초 가까이 걸린다고 한다. 개발자는 날짜를 숫자로 넘긴다. 코드에는 SLE_DT = 20230601처럼 적혀 있다.

테이블과 인덱스 ​

  • CF10 판매: 500,000행 · 4,583블록 · SLE_DT는 VARCHAR2(8) ('20230601') · 하루 약 700건
  • 인덱스 IX_CF10_SLE_DT (SLE_DT): 리프 1,393블록

원본 SQL ​

sql
SELECT COUNT(*)
  FROM CF10
 WHERE SLE_DT = 20230601

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

xplan
--------------------------------------------------------------------------------------------
| Id  | Operation             | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                |      1 |        |      1 |00:00:00.02 |    1406 |
|   1 |  SORT AGGREGATE       |                |      1 |      1 |      1 |00:00:00.02 |    1406 |
|*  2 |   INDEX FAST FULL SCAN| IX_CF10_SLE_DT |      1 |    706 |    706 |00:00:00.02 |    1406 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(TO_NUMBER("SLE_DT")=20230601)

문제 ​

  1. SQL에 쓰지도 않은 TO_NUMBER가 실행계획에 왜 나타났는지 설명하시오.
  2. 인덱스 범위 스캔으로 한 날짜만 읽도록 SQL을 고치시오. 같은 실수가 에러로 드러나는 경우와 조용히 느려지기만 하는 경우가 어떻게 다른지도 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자