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

메뉴를 여러 개 고르는 실적 비교 화면이 상품 인덱스를 처음부터 끝까지 읽는다

중급SELECT유통55 / 700

상황 ​

유통 본사 MD의 「메뉴 비교」 화면은 메뉴를 2 ~ 6개 골라 2년 치 판매 줄 수와 수량, 금액을 나란히 보여 준다. 화면은 고른 상품번호를 쉼표로 이어 문자열 하나('1010,1047,1052')로 넘긴다. 메뉴 하나를 고르는 실적 화면은 같은 인덱스로 0.01초에 끝나는데, 이 화면은 메뉴를 몇 개 고르든 0.2초가 걸린다. MD 여섯 명이 하루 수백 번 쓴다.

테이블과 인덱스 ​

  • CF11 판매상품: 1,096,708행 · 8,204블록 · SLE_NO · ITM_NO NUMBER(5)(팔린 메뉴 88종) · SLE_QTY · SLE_UPRC
  • 인덱스 CF11_PK (SLE_NO, ITM_NO) · IX_CF11_ITM (ITM_NO, SLE_QTY, SLE_UPRC): BLEVEL 2 · 리프 약 3,230블록 · 통계 최신
  • 고른 메뉴의 2년 치 줄 수: 1010(콜드브루) 15,493 · 1047 8,512 · 1052 6,204(합계 30,209)

원본 SQL ​

sql
SELECT ITM_NO, COUNT(*) AS sle_cnt, SUM(SLE_QTY) AS qty, SUM(SLE_QTY * SLE_UPRC) AS amt
  FROM CF11
 WHERE INSTR(',' || :v_items || ',', ',' || ITM_NO || ',') > 0
 GROUP BY ITM_NO
 ORDER BY ITM_NO

실행계획 학습용 예시 ​

xplan
-------------------------------------------------------------------------------------------------
| Id  | Operation              | Name        | Starts | E-Rows | A-Rows | A-Time      | Buffers |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |             |      1 |        |      3 | 00:00:00.21 |    3244 |
|   1 |  SORT GROUP BY         |             |      1 |     88 |      3 | 00:00:00.21 |    3244 |
|*  2 |   INDEX FAST FULL SCAN | IX_CF11_ITM |      1 |  54835 |  30209 | 00:00:00.19 |    3244 |
-------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(INSTR(','||:V_ITEMS||',',','||TO_CHAR("ITM_NO")||',')>0)

문제 ​

  1. 2번 줄이 INDEX RANGE SCAN이 아니라 INDEX FAST FULL SCAN인 이유를 Predicate Information으로 설명하시오.
  2. 고른 메뉴마다 인덱스를 찾아가도록 SQL을 고치시오. 화면이 값을 넘기는 방식을 바꿀 수 없을 때와 바꿀 수 있을 때를 나눠 제안하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자