테마
이 문제는 교재 18화 졸업 과제와 같은 이커머스 데이터베이스를 씁니다. 『튜너의 1년』을 순서대로 읽고 있다면 졸업 과제를 먼저 풀고 오세요. 아래 「테이블과 인덱스」 칸에 과제의 답 일부(제약 조건, 인덱스, 통계의 실제 상태)가 나옵니다.
운영팀의 「일 마감」 화면은 날짜 하나를 고르면 그날의 주문 건수와 매출 합계를 보여 준다. 마감 담당자들이 하루 200번쯤 연다. 실행계획을 본 조민우가 이렇게 말했다. "INDEX SKIP SCAN이 보인다. SKIP SCAN은 선두 컬럼을 빠뜨렸을 때 나오는 나쁜 신호라고 배웠다(IDX-006). 매출까지 담은 (order_date, total_amount) 인덱스를 따로 만들자." 아래는 2024년 6월 14일을 골랐을 때다.
orders: 34,908행 · 193블록 · order_date DATE(시분초 있음, 2020 ~ 2024, 하루 약 20건) · status 6종 · 2024-06-14 주문 19건PK_ORDERS (order_id) · IX_ORD_CUST_DT (customer_id, order_date) · IX_ORD_ST_DT (status, order_date, total_amount): 뒤의 둘은 ACC-005에서 만든 인덱스다 · IX_ORD_ST_DT는 BLEVEL 1 · 리프 약 150블록(상태 하나에 약 25블록) · 통계 최신SELECT COUNT(*) AS ord_cnt, SUM(total_amount) AS amt
FROM orders
WHERE order_date >= TO_DATE(:v_dt, 'YYYYMMDD')
AND order_date < TO_DATE(:v_dt, 'YYYYMMDD') + 1
---------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 13 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 13 |
|* 2 | FILTER | | 1 | | 19 |00:00:00.01 | 13 |
|* 3 | INDEX SKIP SCAN | IX_ORD_ST_DT | 1 | 19 | 19 |00:00:00.01 | 13 |
---------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(TO_DATE(:V_DT,'YYYYMMDD')+1>TO_DATE(:V_DT,'YYYYMMDD'))
3 - access("ORDER_DATE">=TO_DATE(:V_DT,'YYYYMMDD') AND "ORDER_DATE"<TO_DATE(:V_DT,'YYYYMMDD')+1)
filter(("ORDER_DATE">=TO_DATE(:V_DT,'YYYYMMDD') AND "ORDER_DATE"<TO_DATE(:V_DT,'YYYYMMDD')+1))
[같은 조건 · FULL 강제] 193