Skip to content
튜닝 연습서브쿼리와 쿼리 변환
SUBQ-047

패치 뒤로 상품 상세의 「최신 리뷰」가 날짜순이 아니라 뒤죽박죽으로 나온다

기초SELECT이커머스282 / 700

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

상황 ​

상품 상세 화면의 「최신 리뷰」 칸은 그 상품의 리뷰를 작성일 역순으로 보여 주고 작성자 이름을 붙인다. 지난주 DB 패치와 통계 재수집 뒤로 "리뷰가 날짜순이 아니라 뒤죽박죽으로 나온다"는 고객 문의가 들어왔다. 개발자는 "인라인 뷰 안에 ORDER BY를 분명히 넣었고, 패치 전에는 잘 나왔다"라고 한다. 패치 전 계획에는 VIEW와 SORT ORDER BY 줄이 있었고, 고객 테이블은 PK로 NL 조인했다.

테이블과 인덱스 ​

  • reviews: 15,000행 · 775블록 · review_id · product_id · customer_id · rating · content CLOB · created_at · 상품당 34 ~ 76건 · PK 말고는 인덱스가 없다
  • customers: 5,230행 · 51블록 · customer_id PK
  • 아래 실행계획은 리뷰 53건인 상품 · 통계 최신

원본 SQL ​

sql
SELECT r.review_id, r.rating, r.created_at, c.name
  FROM (SELECT review_id, customer_id, rating, created_at
          FROM reviews
         WHERE product_id = :pid
         ORDER BY created_at DESC) r,
       customers c
 WHERE c.customer_id = r.customer_id

실행계획 학습용 예시 ​

xplan
-------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Used-Mem |
-------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |           |      1 |        |     53 |00:00:00.01 |     826 |          |
|*  1 |  HASH JOIN         |           |      1 |     53 |     53 |00:00:00.01 |     826 | 1236K (0)|
|*  2 |   TABLE ACCESS FULL| REVIEWS   |      1 |     53 |     53 |00:00:00.01 |     775 |          |
|   3 |   TABLE ACCESS FULL| CUSTOMERS |      1 |   5230 |   5230 |00:00:00.01 |      51 |          |
-------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("C"."CUSTOMER_ID"="CUSTOMER_ID")
   2 - filter("PRODUCT_ID"=:PID)

[화면 맨 위 다섯 줄의 created_at]
  2023-03-11 · 2024-08-02 · 2021-12-19 · 2024-11-30 · 2022-06-07

문제 ​

  1. 지금 실행계획에 SORT ORDER BY와 VIEW 줄이 없는 이유를 설명하시오. 패치 전에는 순서가 맞게 나온 이유도 설명하시오.
  2. 리뷰가 언제나 작성일 역순으로 나오도록 SQL을 고치고, 그 정렬의 비용을 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자