Skip to content
튜닝 연습소트 튜닝과 페이징
SORT-021

상품평 「더 보기」를 누르면 방금 본 평가가 또 나온다

기초SELECT한빛유통326 / 700

상황 ​

상품 상세 화면 아래의 상품평은 최신순으로 10건을 보여 주고, 「더 보기」를 누르면 다음 10건을 이어 붙인다. 화면은 마지막으로 보인 평가의 평가일(EVL_DT)을 들고 있다가 다음 SQL에 넘긴다. 고객센터에 이런 문의가 들어왔다. "더 보기를 눌렀더니 방금 읽은 평가가 또 나온다. 어떤 상품은 아무리 눌러도 같은 평가만 나온다."

테이블과 인덱스 ​

  • T_ITM_EVL 상품평가: 5,000행 · 48블록 · 상품당 50건 · PK_T_ITM_EVL (ITM_ID, EVL_LST_NO). 인덱스는 PK뿐이다.
  • EVL_LST_NO는 상품마다 평가가 등록된 순서대로 1부터 매기는 번호다.
  • EVL_DT는 DATE지만 앱이 TRUNC해서 넣어 날짜만 있다. 그래서 한 상품에 같은 날짜 평가가 여럿 있다(출시일에는 하루 12건인 상품도 있다).
  • 상품 하나의 평가 50건은 한두 블록에 모여 있다. 통계는 최신이다.

원본 SQL ​

sql
SELECT EVL_LST_NO, CUS_ID, EVL_DT, EVL_PT
  FROM T_ITM_EVL
 WHERE ITM_ID = :itm
   AND EVL_DT <= :last_dt          -- 첫 화면은 :last_dt = 오늘
 ORDER BY EVL_DT DESC
 FETCH FIRST 10 ROWS ONLY

실행계획 학습용 예시 ​

xplan
[「더 보기」 한 번 · 상품 하나 · :last_dt = 2024-06-14]
--------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name         | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Used-Mem |
--------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |              |      1 |        |     10 |00:00:00.01 |       4 |          |
|*  1 |  VIEW                                 |              |      1 |     10 |     10 |00:00:00.01 |       4 |          |
|*  2 |   WINDOW SORT PUSHED RANK             |              |      1 |      3 |     10 |00:00:00.01 |       4 | 2048 (0) |
|*  3 |    TABLE ACCESS BY INDEX ROWID BATCHED| T_ITM_EVL    |      1 |      3 |     43 |00:00:00.01 |       4 |          |
|*  4 |     INDEX RANGE SCAN                  | PK_T_ITM_EVL |      1 |     50 |     50 |00:00:00.01 |       2 |          |
--------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("from$_subquery$_002"."rowlimit_$$_rownumber"<=10)
   2 - filter(ROW_NUMBER() OVER ( ORDER BY INTERNAL_FUNCTION("EVL_DT") DESC )<=10)
   3 - filter("EVL_DT"<=:LAST_DT)
   4 - access("ITM_ID"=:ITM)

[화면 · 평가 번호 (평가일)]
  첫 화면   50 49 48 47 46 45 44 · 43 41 42      (43 · 42 · 41 은 2024-06-14, 마지막 줄은 42)
  더 보기   41 43 42 · 40 39 38 37 36 35 34      ← 6월 14일 평가 세 건이 다시 나온다

문제 ​

  1. 「더 보기」 뒤에 6월 14일 평가 세 건이 다시 나온 까닭을 정렬 키와 조건으로 설명하시오. 같은 날짜 평가가 10건을 넘는 상품에서 "아무리 눌러도 같은 평가만 나오는" 까닭도 쓰시오.
  2. 평가가 빠지거나 겹치지 않도록 SQL을 고치시오. 조건을 EVL_DT < :last_dt로만 바꾸면 어떻게 되는지도 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자