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

본사 대시보드의 월 매장 실적이 한 달을 보려고 47,460블록을 읽는다

기초SELECT버거382 / 700

상황 ​

본사 영업기획팀의 「월 매장 실적」 대시보드(Java, MyBatis)는 월을 고르면 매장별 주문 건수와 영업일 수를 보여 준다. 주문 테이블을 LIST 파티션 복사본 ORD_LIST로 옮긴 뒤에도 빨라지지 않았다. 선배는 "바인드 변수라서 칸을 못 고르는 것 같으니 리터럴로 바꾸자"라고 한다. 매퍼 파라미터 DTO의 ym 필드는 int다.

테이블과 인덱스 ​

  • ORD_LIST 주문(파티션 복사본, 교재 14화): 1,000,000행 · PARTITION BY LIST (ORD_YM) 25칸(P201201 ~ P201312 24칸과 비어 있는 P_DEFAULT (DEFAULT)). 칸 하나를 FULL로 읽으면 약 1,980블록이다(데이터 약 970블록과 적재 때 생긴 빈 블록 약 1,006블록, 교재 14화 §8.5).
  • ORD_YM은 VARCHAR2(6) '201206' 형식의 파티션 키다. 2012년 6월은 41,040건이고 매장은 200개다.
  • LOCAL 인덱스 ORD_LIST_PK (ORD_NO, ORD_YM)과 ORD_LIST_X01 (ORD_DT, ORD_HMS)는 이 조회에 쓰이지 않는다. 통계는 최신이다.

원본 SQL ​

sql
-- MyBatis 매퍼 : WHERE ORD_YM = #{ym}   (DTO 의 ym 은 int)
SELECT SHOP_NO, COUNT(*) AS ord_cnt, COUNT(DISTINCT ORD_DT) AS work_days
  FROM ORD_LIST
 WHERE ORD_YM = :1
 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.47 |   47460 |        |       |
|   1 |  SORT GROUP BY       |          |      1 |    200 |    200 | 00:00:00.47 |   47460 |        |       |
|   2 |   PARTITION LIST ALL |          |      1 |  10000 |  41040 | 00:00:00.43 |   47460 |      1 |    25 |
|*  3 |    TABLE ACCESS FULL | ORD_LIST |     24 |  10000 |  41040 | 00:00:00.42 |   47460 |      1 |    25 |
-------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter(TO_NUMBER("ORD_YM")=:1)

[바인드 — V$SQL_BIND_CAPTURE]
   NAME  DATATYPE_STRING  VALUE_STRING
   :1    NUMBER           201206

문제 ​

  1. 선배의 진단(바인드 변수라서 칸을 못 고른다)이 맞는지 실행계획과 바인드 정보로 판단하시오.
  2. 6월 칸 하나만 읽도록 고치고, 고친 뒤 실행계획의 Pstart와 Pstop이 어떻게 찍힐지 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자