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

주문번호 앞자리로 후보를 띄우는 상담 화면이 한 번 찾을 때마다 대용량 주문을 다 읽는다

실전SELECT한빛유통33 / 700

상황 ​

고객센터의 「주문번호 앞자리 검색」 화면은 고객이 주문번호를 끝까지 불러 주지 못할 때 쓴다. 상담원이 앞 네다섯 자리를 치면 그 숫자로 시작하는 주문이 후보로 뜬다. 상담원 40명이 하루 6천 번쯤 쓴다. 박팀장은 "LIKE를 지우라는 말만으로는 안 된다. 화면 요구를 지키는 방법을 두세 개 놓고 대가까지 비교해 와라"라고 했다.

테이블과 인덱스 ​

  • T_ORD_BIG: 1,000,000행 · 5,826블록 · ORD_SEQ NUMBER(18), 1 ~ 1,000,000(유일, 적재 순서라 번호가 가까우면 같은 블록에 있다) · CUS_ID · ORD_DT · ORD_ST · ORD_AMT
  • 인덱스 IX_ORD_BIG_SEQ (ORD_SEQ): 이 문제에서 만들어 둔 유니크 인덱스 · BLEVEL 2 · 리프 약 2,090블록 · 통계 최신
  • 화면은 상담원이 친 숫자를 문자열(:v_prefix)로 넘긴다

원본 SQL ​

sql
SELECT ORD_SEQ, CUS_ID, ORD_DT, ORD_ST, ORD_AMT
  FROM T_ORD_BIG
 WHERE ORD_SEQ LIKE :v_prefix || '%'
 ORDER BY ORD_SEQ

실행계획 학습용 예시 ​

xplan
[상담원이 4821을 쳤을 때]
------------------------------------------------------------------------------------------
| Id  | Operation          | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |           |      1 |        |    111 |00:00:00.14 |    5826 |
|   1 |  SORT ORDER BY     |           |      1 |  50000 |    111 |00:00:00.14 |    5826 |
|*  2 |   TABLE ACCESS FULL| T_ORD_BIG |      1 |  50000 |    111 |00:00:00.14 |    5826 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(TO_CHAR("ORD_SEQ") LIKE :V_PREFIX||'%')

문제 ​

  1. 2번 줄의 TO_CHAR가 왜 생겼는지 설명하고, '4821'로 시작하는 주문이 왜 111건인지 숫자로 설명하시오.
  2. 화면 요구(앞자리로 후보 찾기)를 지키는 방법으로 ① 숫자 범위로 바꾸기 ② 문자 사본 컬럼(가상 컬럼)과 인덱스 ③ 요구 재협상(다른 단서를 함께 받기)을 비교하시오.
  3. 채택한 방법을 SQL로 작성하고, 입력값에 둘 제한을 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자