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

판매 테이블에서 잘 되던 월 조회 LIKE를 DW 집계 테이블에 썼더니 전체를 읽는다

기초SELECT유통27 / 700

상황 ​

유통 본사 DW팀이 판매(CF10, CF11)를 매일 밤 집계해 「일별 상품 판매」 테이블을 만들었다. 기획팀의 「매장별 월 매출」 화면은 이 테이블에서 한 달을 골라 합계를 낸다. 개발자는 판매 테이블에서 쓰던 방식(SLE_DT LIKE '202306%', 교재 03화에서 인덱스 범위 스캔이 되던 모양)을 그대로 가져왔다. 그런데 이 화면은 인덱스가 있는데도 테이블 전체를 읽는다.

테이블과 인덱스 ​

  • DW_SLE_DD 일별 상품 판매(이 문제에서 쓰는 파생 테이블, 판매와 판매상품을 매장 · 일 · 상품별로 집계): 292,000행 · 1,460블록 · 날짜순 적재
  • SLE_YMD NUMBER(8) (20220101 ~ 20231231) · SHP_NO 5곳 · ITM_NO · SLE_QTY · SLE_AMT · 한 달 약 12,000행
  • 인덱스 IX_DW_SLE_DD_YMD (SLE_YMD): BLEVEL 1 · 리프 650블록 · 통계 최신

원본 SQL ​

sql
SELECT SHP_NO, SUM(SLE_QTY) AS qty, SUM(SLE_AMT) AS amt
  FROM DW_SLE_DD
 WHERE SLE_YMD LIKE :v_ym || '%'
 GROUP BY SHP_NO
 ORDER BY amt DESC

실행계획 학습용 예시 ​

xplan
[2023년 6월 · :v_ym = '202306']
------------------------------------------------------------------------------------------
| Id  | Operation           | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |           |      1 |        |      5 |00:00:00.04 |    1464 |
|   1 |  SORT ORDER BY      |           |      1 |      5 |      5 |00:00:00.04 |    1464 |
|   2 |   HASH GROUP BY     |           |      1 |      5 |      5 |00:00:00.04 |    1464 |
|*  3 |    TABLE ACCESS FULL| DW_SLE_DD |      1 |  14600 |  12000 |00:00:00.03 |    1464 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter(TO_CHAR("SLE_YMD") LIKE :V_YM||'%')

문제 ​

  1. 판매 테이블에서는 범위 스캔이던 LIKE '202306%'가 이 테이블에서는 왜 TABLE ACCESS FULL이 되는지 3번 줄로 설명하시오.
  2. 같은 결과를 내면서 인덱스 범위 스캔이 되도록 조건을 고치시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자