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

석 달만 보는데 24개월 칸을 전부 연다

기초SELECT버거376 / 700

상황 ​

본사 영업기획팀의 「분기 매장 실적」은 연도와 분기를 고르면 매장별 주문 건수를 낸다. 분기 회의 전 주에 수십 번 돌린다. "파티션을 했다는데 왜 이렇게 오래 걸리나." 화면은 :v_yyyy = '2012'와 :v_q = '3'을 넘긴다.

테이블과 인덱스 ​

  • ORD_RANGE 주문(파티션 복사본): 1,000,000행 · PARTITION BY RANGE (ORD_YM) 월별 25칸. P201201 ~ P201312 24칸에 P_DEFAULT (MAXVALUE) 1칸이 더 있다(비어 있고 세그먼트가 없다).
  • ORD_YM은 VARCHAR2(6) '201207' 형식의 파티션 키이고, 적재할 때 SUBSTR(ORD_DT,1,6)으로 채웠다. 칸 하나를 FULL로 읽으면 약 1,980블록이다(데이터 약 970블록, 적재 때 생긴 빈 블록 약 1,006블록, 교재 14화 §8.5).
  • 2012년 3분기(7 ~ 9월)는 약 126,000건, 200개 매장이다.
  • LOCAL 인덱스 ORD_RANGE_PK (ORD_NO, ORD_YM)와 ORD_RANGE_X01 (ORD_DT, ORD_HMS)가 있지만 이 조회에는 쓰이지 않는다(통계 100%).

원본 SQL ​

sql
SELECT SHOP_NO, COUNT(*) AS ord_cnt
  FROM ORD_RANGE
 WHERE SUBSTR(ORD_YM, 1, 4) = :v_yyyy
   AND TO_CHAR(TO_DATE(ORD_YM, 'YYYYMM'), 'Q') = :v_q
 GROUP BY SHOP_NO
 ORDER BY SHOP_NO

실행계획 학습용 예시 · 교재 14화 규모 ​

xplan
---------------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name      | Starts | E-Rows | A-Rows |    A-Time   | Buffers | Pstart | Pstop |
---------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |           |      1 |        |    200 | 00:00:00.46 |   47460 |        |       |
|   1 |  SORT GROUP BY        |           |      1 |    100 |    200 | 00:00:00.46 |   47460 |        |       |
|   2 |   PARTITION RANGE ALL |           |      1 |    100 |   126K | 00:00:00.43 |   47460 |      1 |    25 |
|*  3 |    TABLE ACCESS FULL  | ORD_RANGE |     24 |    100 |   126K | 00:00:00.42 |   47460 |      1 |    25 |
---------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter((SUBSTR("ORD_YM",1,4)=:V_YYYY AND
              TO_CHAR(TO_DATE("ORD_YM",'YYYYMM'),'Q')=:V_Q))

문제 ​

  1. 실행계획의 어느 항목에서 파티션을 전부 열었다는 것을 알 수 있는지 쓰고, 왜 전부 열었는지 설명하시오.
  2. 결과가 바뀌지 않게 SQL을 고쳐 2012년 3분기의 칸만 열게 하고, 몇 블록이 될지 어림하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자