테마
이 문제는 교재 18화 졸업 과제와 같은 이커머스 데이터베이스를 씁니다. 『튜너의 1년』을 순서대로 읽고 있다면 졸업 과제를 먼저 풀고 오세요. 아래 「테이블과 인덱스」 칸에 과제의 답 일부(제약 조건, 인덱스, 통계의 실제 상태)가 나옵니다.
MD팀의 「카테고리별 평점 현황」은 카테고리마다 상품 수, 리뷰 수, 상품 평점의 평균을 보여 준다. 기획 회의 때마다 여러 번 돌리는데 한 번에 1.1초 걸린다. 개발자는 "19c부터는 옵티마이저가 스칼라 서브쿼리를 알아서 조인으로 펼친다고 들었는데, 계획에는 서브쿼리가 그대로 남아 있다"라고 했다.
products: 280행 · 8블록 · PK만 있음 · 상품이 달린 카테고리는 40개reviews: 15,000행 · 775블록 · PK(review_id)만 있음 · 상품당 34 ~ 76건 · product_id에는 인덱스가 없다SELECT p.category_id,
COUNT(*) AS product_cnt,
SUM((SELECT COUNT(*) FROM reviews r WHERE r.product_id = p.product_id)) AS review_cnt,
ROUND(AVG((SELECT AVG(r.rating) FROM reviews r WHERE r.product_id = p.product_id)), 2) AS avg_rating
FROM products p
GROUP BY p.category_id
ORDER BY p.category_id
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 40 |00:00:01.12 | 434K|
| 1 | SORT AGGREGATE | | 280 | 1 | 280 |00:00:00.55 | 217K|
|* 2 | TABLE ACCESS FULL| REVIEWS | 280 | 54 | 15000 |00:00:00.54 | 217K|
| 3 | SORT AGGREGATE | | 280 | 1 | 280 |00:00:00.56 | 217K|
|* 4 | TABLE ACCESS FULL| REVIEWS | 280 | 54 | 15000 |00:00:00.55 | 217K|
| 5 | SORT GROUP BY | | 1 | 40 | 40 |00:00:01.12 | 434K|
| 6 | TABLE ACCESS FULL| PRODUCTS | 1 | 280 | 280 |00:00:00.01 | 8 |
--------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("R"."PRODUCT_ID"=:B1)
4 - filter("R"."PRODUCT_ID"=:B1)
(DBMS_XPLAN 이 줄여 쓴 값 — 217K = 217,000 · 434K = 434,008)