테마
버거원 마케팅팀은 「프로모션 시간대 매출」 화면에 시작 일시와 끝 일시를 14자리('YYYYMMDDHH24MISS')로 넣어 매장별 주문 수를 본다. 주말 야간과 브런치처럼 날을 넘기는 구간이 많다.
개발자는 "날짜와 시각이 두 컬럼이라 이어 붙여 한 번에 비교했다"라고 한다. ORD_X01이 바로 (날짜, 시각) 인덱스인데도 테이블 전체를 읽는다. 아래는 2013년 3월 1일 18시부터 3월 3일 12시까지를 넣었을 때다.
ORD: 1,000,000행 · 22,422블록 · 주문 일시 순으로 쌓였다ORD_DT VARCHAR2(8) '20130301' · ORD_HMS VARCHAR2(6) '183015'(항상 6자리, 영업시간 09:00:00 ~ 22:59:59)ORD_X01 (ORD_DT, ORD_HMS): BLEVEL 2 · 리프 3,774 · CF 22,223 · ORD_PK (ORD_NO) · 통계 최신SELECT SHOP_NO, COUNT(*) AS ord_cnt
FROM ORD
WHERE ORD_DT || ORD_HMS BETWEEN :v_from_dtm AND :v_to_dtm
GROUP BY SHOP_NO
-----------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 200 |00:00:00.24 | 22239 |
| 1 | HASH GROUP BY | | 1 | 200 | 200 |00:00:00.24 | 22239 |
|* 2 | TABLE ACCESS FULL| ORD | 1 | 2500 | 2112 |00:00:00.22 | 22239 |
-----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(("ORD_DT"||"ORD_HMS">=:V_FROM_DTM AND "ORD_DT"||"ORD_HMS"<=:V_TO_DTM))
ORD_X01의 두 컬럼을 다 썼는데도 테이블 전체를 읽는 이유를 설명하시오.ORD_X01의 범위를 읽도록 하시오. 이어 붙인 조건을 지울지 남길지 정하고 그 이유를 설명하시오.