테마
이 문제는 교재 18화 졸업 과제와 같은 이커머스 데이터베이스를 씁니다. 『튜너의 1년』을 순서대로 읽고 있다면 졸업 과제를 먼저 풀고 오세요. 아래 「테이블과 인덱스」 칸에 과제의 답 일부(제약 조건, 인덱스, 통계의 실제 상태)가 나옵니다.
마케팅팀은 매일 밤 상품 280개를 대분류와 소분류 이름과 함께 가격 비교 사이트에 보낸다. 업체가 "상품이 39개 빠져 있다"라고 알려 왔다. 빠진 상품을 찾아보니 모두 소분류 없이 대분류에 바로 걸린 상품이었다(기프트카드, 정기배송 상품 등). 파일을 만드는 SQL은 아래 하나다.
products: 280행 · 8블록 · category_id · PK만 있음categories: 53행 · 4블록 · category_id · parent_id · name · PK만 있음parent_id가 NULL이고, 소분류 44개는 대분류를 가리킨다SELECT p.product_id, p.name AS product_name,
u.name AS top_category, g.name AS sub_category
FROM products p, categories g, categories u
WHERE g.category_id = p.category_id
AND u.category_id = g.parent_id
ORDER BY p.product_id
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 241 |00:00:00.01 | 16 |
| 1 | SORT ORDER BY | | 1 | 234 | 241 |00:00:00.01 | 16 |
|* 2 | HASH JOIN | | 1 | 234 | 241 |00:00:00.01 | 16 |
|* 3 | HASH JOIN | | 1 | 44 | 44 |00:00:00.01 | 8 |
| 4 | TABLE ACCESS FULL| CATEGORIES | 1 | 53 | 53 |00:00:00.01 | 4 |
| 5 | TABLE ACCESS FULL| CATEGORIES | 1 | 53 | 53 |00:00:00.01 | 4 |
| 6 | TABLE ACCESS FULL | PRODUCTS | 1 | 280 | 280 |00:00:00.01 | 8 |
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("G"."CATEGORY_ID"="P"."CATEGORY_ID")
3 - access("U"."CATEGORY_ID"="G"."PARENT_ID")
(+)를 어느 쪽에 붙이는지와 그 이유도 쓰시오.