테마
이 문제는 교재 18화 졸업 과제와 같은 이커머스 데이터베이스를 씁니다. 『튜너의 1년』을 순서대로 읽고 있다면 졸업 과제를 먼저 풀고 오세요. 아래 「테이블과 인덱스」 칸에 과제의 답 일부(제약 조건, 인덱스, 통계의 실제 상태)가 나옵니다.
고객센터 「포인트 내역」 화면은 고객 한 명의 포인트 거래를 최신순으로 보여 주고, 줄마다 그 거래 직후의 잔액을 붙인다. 상담원 40명이 하루 약 3만 번 연다. 상담원이 캡처를 보내왔다. "주문할 때 포인트를 쓰고 같은 주문으로 적립도 받은 고객인데, 사용 줄과 적립 줄의 잔액이 똑같아요. 사용 직후 잔액이 안 보여서 설명을 못 했어요." 주문을 확정하는 프로시저가 사용과 적립을 같은 초에 넣는다.
point_transactions: 45,000행 · 210블록 · tx_id(시퀀스로 넣는 순서대로 매긴다) · customer_id · amount(늘 양수) · tx_type(EARN · USE · EXPIRE) · created_at DATE(초까지)tx_id)뿐이다. 통계는 최신이다.SELECT tx_id, tx_type, amount, created_at,
SUM(CASE tx_type WHEN 'EARN' THEN amount ELSE -amount END)
OVER (ORDER BY created_at) AS balance
FROM point_transactions
WHERE customer_id = :cus
ORDER BY created_at DESC
[고객 4417 · 거래 12건]
---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Used-Mem |
---------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 12 |00:00:00.01 | 210 | |
| 1 | SORT ORDER BY | | 1 | 9 | 12 |00:00:00.01 | 210 | 2048 (0) |
| 2 | WINDOW SORT | | 1 | 9 | 12 |00:00:00.01 | 210 | 2048 (0) |
|* 3 | TABLE ACCESS FULL| POINT_TRANSACTIONS | 1 | 9 | 12 |00:00:00.01 | 210 | |
---------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("CUSTOMER_ID"=:CUS)
[화면 · 위가 최신]
TX_ID TX_TYPE AMOUNT CREATED_AT BALANCE
41207 EARN 320 2024-06-14 13:02:11 1,870
41206 USE 1,000 2024-06-14 13:02:11 1,870 ← 사용 직후 잔액은 1,550이어야 한다
38810 EARN 450 2024-05-30 19:44:02 2,550
…