Skip to content
튜닝 연습파티션
PART-010

행사일 엿새의 판매를 세는데 2년 치 판매 칸을 다 연다

중급SELECT유통385 / 700

상황 ​

마케팅팀이 관리하는 행사 테이블 MK_EVT_DAY에는 행사일이 NUMBER(8)(20230505)로 들어 있다. 영업관리팀의 「행사일 판매 분석」은 연도를 고르면 그해 행사일의 매장별 판매 건수를 낸다. 분기 리뷰 주간에 수십 번 돌린다. 2023년 행사일은 엿새이고 5월, 6월, 9월, 12월의 네 달에 걸쳐 있다.

테이블과 인덱스 ​

  • CF10_P 판매(파티션 복사본, 문제 설정): CF10 500,000행을 PARTITION BY RANGE (SLE_DT) 월별 24칸(P202201 ~ P202312)과 빈 PMAX로 나눠 CTAS로 지었다. 칸 하나는 약 20,800행이고 FULL로 약 191블록, 24칸 전체는 약 4,610블록이다. 2023년 5월은 17번째, 12월은 24번째 칸이다.
  • SLE_DT는 VARCHAR2(8) '20230505'이다. 행사일 하루 판매는 약 700건이고 엿새면 4,236건이다.
  • MK_EVT_DAY 행사일(문제 설정, 마케팅팀 테이블): 40행 · 4블록 · EVT_CD · EVT_YMD NUMBER(8) · EVT_YY VARCHAR2(4). EVT_YMD는 모두 8자리다.
  • 이 조회에 쓸 인덱스는 없다. 통계는 최신이다.

원본 SQL ​

sql
SELECT c.SHP_NO, COUNT(*) AS evt_sle_cnt
  FROM CF10_P c
 WHERE c.SLE_DT IN (SELECT e.EVT_YMD
                      FROM MK_EVT_DAY e
                     WHERE e.EVT_YY = :v_yy)
 GROUP BY c.SHP_NO

실행계획 학습용 예시 ​

xplan
-----------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name       | Starts | E-Rows | A-Rows |      A-Time | Buffers | Pstart | Pstop |
-----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |            |      1 |        |      5 | 00:00:00.11 |    4614 |        |       |
|   1 |  HASH GROUP BY         |            |      1 |      5 |      5 | 00:00:00.11 |    4614 |        |       |
|*  2 |   HASH JOIN RIGHT SEMI |            |      1 |   5000 |   4236 | 00:00:00.11 |    4614 |        |       |
|*  3 |    TABLE ACCESS FULL   | MK_EVT_DAY |      1 |      7 |      6 | 00:00:00.01 |       4 |        |       |
|   4 |    PARTITION RANGE ALL |            |      1 |   500K |   500K | 00:00:00.05 |    4610 |      1 |    25 |
|   5 |     TABLE ACCESS FULL  | CF10_P     |     24 |   500K |   500K | 00:00:00.04 |    4610 |      1 |    25 |
-----------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("E"."EVT_YMD"=TO_NUMBER("C"."SLE_DT"))
   3 - filter("E"."EVT_YY"=:V_YY)

문제 ​

  1. CF10_P를 몇 칸 열었는지 쓰고, 행사일이 네 달에 몰려 있는데도 칸을 고르지 못한 까닭을 Predicate Information으로 설명하시오.
  2. 결과가 바뀌지 않게 SQL을 고쳐 행사일이 든 칸만 읽게 하고, 고친 뒤 실행계획에서 무엇이 칸을 고르는지 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자