테마
정산팀의 「결제 대기 정리」는 결제 대기(PENDING) 주문을 최신순(ORD_DT DESC, ORD_SEQ DESC)으로 한 쪽에 20건씩 보여 준다. 정산팀은 오래된 대기 건부터 처리하려고 쪽 번호 칸에 마지막 쪽 근처(3,990쪽 안팎)를 넣고 넘어가는데, 그때마다 3초 넘게 멈춘다. 정산팀은 한 쪽을 처리하면(결제 확인 뒤 COMPLETE로 바꾼다) 다음 쪽으로 넘어간다.
오과장은 ROWID로 테이블 액세스를 늦추는 안, 커버링 인덱스 안, 키 기반 페이징 안을 숫자와 부작용으로 비교한 리포트를 원한다.
T_ORD_BIG: 1,000,000행 · 5,826블록 · ORD_ST PENDING 8%(80,000건) · COMPLETE 90% · CANCEL 2%IX_ORD_BIG_ST_DT (ORD_ST, ORD_DT, ORD_SEQ): 높이 3 · 리프 약 3,800블록(한 블록에 약 263개). 같은 상태의 주문은 테이블 곳곳에 흩어져 있다(클러스터링 팩터가 행 수에 가깝다).ORD_SEQ, ORD_DT, CUS_ID, ORD_AMT 넷이다. 정산팀은 하루 수백 건을 PENDING에서 COMPLETE로 바꾼다.SELECT ORD_SEQ, ORD_DT, CUS_ID, ORD_AMT
FROM (SELECT ROWNUM rn, a.*
FROM (SELECT ORD_SEQ, ORD_DT, CUS_ID, ORD_AMT
FROM T_ORD_BIG
WHERE ORD_ST = 'PENDING'
ORDER BY ORD_DT DESC, ORD_SEQ DESC) a
WHERE ROWNUM <= :page * 20)
WHERE rn > (:page - 1) * 20
[3,990쪽 · 79,781 ~ 79,800번째] (1쪽은 같은 모양 · A-Rows 20 · Buffers 23)
----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads |
----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 20 |00:00:03.21 | 80107 | 5512 |
|* 1 | VIEW | | 1 | 20 | 20 |00:00:03.21 | 80107 | 5512 |
|* 2 | COUNT STOPKEY | | 1 | | 79800 |00:00:03.20 | 80107 | 5512 |
| 3 | VIEW | | 1 | 80000 | 79800 |00:00:03.17 | 80107 | 5512 |
| 4 | TABLE ACCESS BY INDEX ROWID | T_ORD_BIG | 1 | 80000 | 79800 |00:00:03.14 | 80107 | 5512 |
|* 5 | INDEX RANGE SCAN DESCENDING| IX_ORD_BIG_ST_DT | 1 | 80000 | 79800 |00:00:00.05 | 307 | 0 |
----------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("RN">(:PAGE-1)*20)
2 - filter(ROWNUM<=:PAGE*20)
5 - access("ORD_ST"='PENDING')