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

하룻밤 판매 40건을 세는 조회가 판매 테이블을 통째로 읽는다

중급SELECT유통380 / 700

상황 ​

본사 영업관리팀의 「야간 판매 점검」은 영업일 22시부터 다음 날 06시까지의 판매를 매장별, 일자별로 센다. 야간 운영 매장을 점검하려고 매일 아침 담당자 다섯 명이 몇 번씩 돌린다. 화면은 시작과 끝을 'YYYYMMDDHH24MISS' 14자리 문자열(:v_from, :v_to)로 넘긴다. 아래는 2023년 6월 30일 22시 ~ 7월 1일 06시('20230630220000' ~ '20230701060000')를 넘긴 실행이다.

테이블과 인덱스 ​

  • CF10_P 판매(파티션 복사본, 문제 설정): CF10 500,000행을 PARTITION BY RANGE (SLE_DT) 월별 24칸(P202201 ~ P202312, 경계는 VALUES LESS THAN ('20220201') 꼴)과 빈 PMAX 1칸으로 나눠 CTAS로 지었다. 칸 하나는 약 20,800행이고 FULL로 읽으면 약 191블록, 24칸 전체는 약 4,610블록이다.
  • SLE_DT는 VARCHAR2(8) '20230630', SLE_HMS는 VARCHAR2(6) '223015'이다. 둘 다 자릿수가 고정이고 숫자만 들어 있다(교재 03화 실측).
  • P202306은 18번째 칸, P202307은 19번째 칸이다. 22시 ~ 06시 판매는 하룻밤에 약 40건이다.
  • 이 조회에 쓸 인덱스는 없다. 통계는 최신이다.

원본 SQL ​

sql
SELECT SHP_NO, SLE_DT, COUNT(*) AS night_cnt
  FROM CF10_P
 WHERE SLE_DT || SLE_HMS BETWEEN :v_from AND :v_to
 GROUP BY SHP_NO, SLE_DT
 ORDER BY SHP_NO, SLE_DT

실행계획 학습용 예시 ​

xplan
------------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name   | Starts | E-Rows | A-Rows |      A-Time | Buffers | Pstart | Pstop |
------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |        |      1 |        |     10 | 00:00:00.09 |    4610 |        |       |
|   1 |  SORT GROUP BY        |        |      1 |   1250 |     10 | 00:00:00.09 |    4610 |        |       |
|   2 |   PARTITION RANGE ALL |        |      1 |   1250 |     41 | 00:00:00.09 |    4610 |      1 |    25 |
|*  3 |    TABLE ACCESS FULL  | CF10_P |     24 |   1250 |     41 | 00:00:00.08 |    4610 |      1 |    25 |
------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter(("SLE_DT"||"SLE_HMS">=:V_FROM AND "SLE_DT"||"SLE_HMS"<=:V_TO))

문제 ​

  1. 칸을 몇 개 열었는지 실행계획에서 찾고, 두 컬럼을 이어 붙인 조건으로는 칸을 고르지 못하는 까닭을 설명하시오.
  2. 결과가 바뀌지 않게 SQL을 고쳐 필요한 칸만 열게 하고, 이번 실행에서 몇 칸을 열지 쓰시오. 이어 붙인 조건을 지워도 되는지도 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자