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

상담원 30명의 「오늘 주문」 상황판이 1분마다 주문 테이블을 다 읽는다

기초SELECT한빛유통08 / 700

상황 ​

고객센터 상황판 맨 위 칸은 오늘 들어온 주문을 최신순으로 보여 준다. 상담원 PC 30대가 1분마다 새로 고친다. 조민우는 이렇게 말한다. "ORD_DT에 시분초가 있어서 TRUNC로 날짜만 맞췄어요. 형변환도 아니고 날짜를 자르기만 했는데, 이것도 가공인가요?" 아래는 2024년 6월 14일 밤(그날 주문 137건)에 잰 계획이다.

테이블과 인덱스 ​

  • T_ORD 주문: 100,000행 · 896블록 · ORD_DT DATE(시분초 있음, 2023-01-01 ~ 2024-12-30) · 하루 136 ~ 137건
  • 적재 순서가 날짜 순이 아니어서 하루치 주문 137건은 서로 다른 블록 137개에 흩어져 있다
  • 인덱스 PK_T_ORD (ORD_SEQ) · IX_T_ORD_DT (ORD_DT): BLEVEL 1 · 리프 265블록 · 통계 최신

원본 SQL ​

sql
SELECT ORD_SEQ, CUS_ID, ORD_DT, ORD_ST, ORD_AMT
  FROM T_ORD
 WHERE TRUNC(ORD_DT) = TRUNC(SYSDATE)
 ORDER BY ORD_DT DESC

실행계획 학습용 예시 · 건수는 적재 스크립트 그대로 ​

xplan
------------------------------------------------------------------------------------------------
| Id  | Operation          | Name  | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Used-Mem |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |      1 |        |    137 |00:00:00.01 |     896 |          |
|   1 |  SORT ORDER BY     |       |      1 |   1000 |    137 |00:00:00.01 |     896 |18432  (0)|
|*  2 |   TABLE ACCESS FULL| T_ORD |      1 |   1000 |    137 |00:00:00.01 |     896 |          |
------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(TRUNC(INTERNAL_FUNCTION("ORD_DT"))=TRUNC(SYSDATE@!))

문제 ​

  1. TRUNC는 형변환이 아닌데도 IX_T_ORD_DT를 쓰지 못하는 이유를 실행계획의 어느 줄에서 알 수 있는지 설명하시오.
  2. 결과가 바뀌지 않게 SQL을 고쳐 인덱스 범위 스캔이 되도록 하시오. 정렬(SORT ORDER BY)이 어떻게 되는지도 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자