Skip to content
튜닝 연습조인 튜닝
JOIN-036

가격 비교 사이트로 보내는 상품 파일에 280개 중 241개만 실린다

기초SELECT이커머스186 / 700

이 문제는 교재 18화 졸업 과제와 같은 이커머스 데이터베이스를 씁니다. 『튜너의 1년』을 순서대로 읽고 있다면 졸업 과제를 먼저 풀고 오세요. 아래 「테이블과 인덱스」 칸에 과제의 답 일부(제약 조건, 인덱스, 통계의 실제 상태)가 나옵니다.

상황 ​

마케팅팀은 매일 밤 상품 280개를 대분류와 소분류 이름과 함께 가격 비교 사이트에 보낸다. 업체가 "상품이 39개 빠져 있다"라고 알려 왔다. 빠진 상품을 찾아보니 모두 소분류 없이 대분류에 바로 걸린 상품이었다(기프트카드, 정기배송 상품 등). 파일을 만드는 SQL은 아래 하나다.

테이블과 인덱스 ​

  • products: 280행 · 8블록 · category_id · PK만 있음
  • categories: 53행 · 4블록 · category_id · parent_id · name · PK만 있음
  • 분류는 2단계다. 대분류 9개는 parent_id가 NULL이고, 소분류 44개는 대분류를 가리킨다
  • 상품 280개 중 241개는 소분류에, 39개는 대분류에 바로 걸려 있다 · 통계 최신

원본 SQL ​

sql
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

실행계획 학습용 예시 ​

xplan
-----------------------------------------------------------------------------------------
| 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")

문제 ​

  1. 실행계획 3번 줄의 A-Rows 44가 무엇을 뜻하는지 설명하고, 상품 39개가 빠진 이유를 쓰시오.
  2. 상품 280개가 모두 나오도록 SQL을 고치시오. 대분류에 바로 걸린 상품은 대분류 칸에 그 분류 이름이, 소분류 칸에는 NULL이 나오게 하시오. (+)를 어느 쪽에 붙이는지와 그 이유도 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자