테마
이 문제는 교재 18화 졸업 과제와 같은 이커머스 데이터베이스를 씁니다. 『튜너의 1년』을 순서대로 읽고 있다면 졸업 과제를 먼저 풀고 오세요. 아래 「테이블과 인덱스」 칸에 과제의 답 일부(제약 조건, 인덱스, 통계의 실제 상태)가 나옵니다.
상품 상세 화면 오른쪽 위에는 「최근 1년 조회 n회」가 뜬다. 상세 화면은 하루 약 4만 번 열린다.
이 숫자를 세는 SQL은 밤마다 도는 「상품별 일 조회수」 집계 배치를 위해 만든 (view_date, product_id) 인덱스를 타는데, 한 번에 58블록을 읽는다. product_views는 상세 화면이 열릴 때마다 한 행씩 INSERT되는 로그 테이블이다.
product_views 상품 조회 로그: 100,000행 · 367블록 · view_date DATE(시분초 있음) · 이 문제에서는 2020 ~ 2024년에 고르게 분포한다고 본다(하루 약 55건, 최근 1년 약 20,000행)(view_id) · IX_PV_DT_PRD (view_date, product_id): 집계 배치용 · BLEVEL 1 · 리프 약 280블록(리프 한 블록에 약 360항목) · 통계 최신view_date >= TRUNC(SYSDATE) - 1 AND view_date < TRUNC(SYSDATE)로 어제 하루를 상품별로 센다 · 하루 한 번SELECT COUNT(*) AS view_cnt
FROM product_views
WHERE product_id = :p
AND view_date >= ADD_MONTHS(TRUNC(SYSDATE), -12)
AND view_date < TRUNC(SYSDATE) + 1
---------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 58 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 58 |
|* 2 | INDEX RANGE SCAN | IX_PV_DT_PRD | 1 | 71 | 74 |00:00:00.01 | 58 |
---------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("VIEW_DATE">=ADD_MONTHS(TRUNC(SYSDATE@!),-12) AND "PRODUCT_ID"=:P AND
"VIEW_DATE"<TRUNC(SYSDATE@!)+1)
filter("PRODUCT_ID"=:P)