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

영수증 번호 네 자리를 치면 판매 2천 건이 뜬다

기초SELECT유통03 / 700

상황 ​

유통 매장 POS의 「영수증 재조회」 화면이다. 환불이나 교환 손님이 오면 직원이 영수증 맨 아래 판매번호의 뒤 네 자리(그날의 일련번호)를 친다. 매장 다섯 곳에서 하루 수백 번 쓴다. 직원들은 이렇게 말한다. "칠 때마다 굼뜨고, 목록이 2천 줄쯤 나와서 손님 영수증을 눈으로 찾는다." 아래는 손님 영수증 20230601-0308을 찾으려고 0308을 쳤을 때다.

테이블과 인덱스 ​

  • CF10 판매: 500,000행 · 4,583블록 · 2022-01-01 ~ 2023-12-31 · 하루 596 ~ 793건
  • SLE_NO VARCHAR2(15): 판매일자 8자리 + - + 그날의 일련번호 4자리 ('20230601-0308'). 영수증에는 판매번호와 판매일자가 함께 찍힌다
  • 인덱스 CF10_PK (SLE_NO): BLEVEL 2 · 리프 약 1,680블록 · 통계 최신 · 다른 인덱스 없음

원본 SQL ​

sql
SELECT SLE_NO, SLE_DT, SLE_HMS, SHP_NO
  FROM CF10
 WHERE SLE_NO LIKE '%' || :v_no || '%'

실행계획 학습용 예시 · 건수는 적재 데이터 그대로 ​

xplan
-------------------------------------------------------------------------------------
| Id  | Operation         | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |      1 |        |   2053 |00:00:00.05 |    4587 |
|*  1 |  TABLE ACCESS FULL| CF10 |      1 |  25000 |   2053 |00:00:00.05 |    4587 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("SLE_NO" LIKE '%'||:V_NO||'%')

문제 ​

  1. CF10_PK가 바로 SLE_NO 인덱스인데도 TABLE ACCESS FULL로 처리되는 이유를 실행계획의 어느 줄에서 알 수 있는지 설명하시오. 결과가 1건이 아니라 2,053건인 이유도 설명하시오.
  2. 손님 영수증 한 장만 찾도록 SQL을 고치시오. 요구를 바꿀 수 없을 때의 대안(뒷자리나 역순 값으로 만든 인덱스, 전문 검색)과 각각의 대가도 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자