테마
본사 영업기획팀의 「월 매장 실적」 대시보드(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개다.ORD_LIST_PK (ORD_NO, ORD_YM)과 ORD_LIST_X01 (ORD_DT, ORD_HMS)는 이 조회에 쓰이지 않는다. 통계는 최신이다.-- 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
-------------------------------------------------------------------------------------------------------------
| 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