테마
이 문제는 교재 18화 졸업 과제와 같은 이커머스 데이터베이스를 씁니다. 『튜너의 1년』을 순서대로 읽고 있다면 졸업 과제를 먼저 풀고 오세요. 아래 「테이블과 인덱스」 칸에 과제의 답 일부(제약 조건, 인덱스, 통계의 실제 상태)가 나옵니다.
마케팅팀은 11월에 주문한 고객에게 감사 쿠폰을 한 장씩 주기로 했다. 개발자는 처음에 IN 서브쿼리로 짰다가 "조인이 더 빠르다"는 말을 듣고 조인으로 바꿔 배포했다.
발급 다음 날 고객센터에 "쿠폰이 세 장 왔다"는 문의가 들어왔다.
customers 고객: 5,230행 · 51블록 · PK(customer_id)만 있다orders 주문: 34,908행 · 193블록 · PK(order_id)만 있고 customer_id에는 인덱스가 없다 · 2024년 11월 주문 582건, 주문한 고객 523명(두 번 주문 53명, 세 번 주문 3명)coupon_issue 쿠폰 발급: 이번 행사를 위해 만든 테이블 (customer_id, coupon_cd, issued_at) · 제약과 인덱스 없음INSERT INTO coupon_issue (customer_id, coupon_cd, issued_at)
SELECT c.customer_id, 'THX2411', SYSDATE
FROM customers c, orders o
WHERE o.customer_id = c.customer_id
AND o.order_date >= DATE '2024-11-01'
AND o.order_date < DATE '2024-12-01'
-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | | 0 |00:00:00.02 | 822 |
| 1 | LOAD TABLE CONVENTIONAL | COUPON_ISSUE | 1 | | 0 |00:00:00.02 | 822 |
|* 2 | HASH JOIN | | 1 | 582 | 582 |00:00:00.01 | 244 |
|* 3 | TABLE ACCESS FULL | ORDERS | 1 | 582 | 582 |00:00:00.01 | 193 |
| 4 | TABLE ACCESS FULL | CUSTOMERS | 1 | 5230 | 5230 |00:00:00.01 | 51 |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("O"."CUSTOMER_ID"="C"."CUSTOMER_ID")
3 - filter(("O"."ORDER_DATE">=TO_DATE(' 2024-11-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND
"O"."ORDER_DATE"<TO_DATE(' 2024-12-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss')))