테마
상품관리팀의 「상품 주문 내역」은 상품 하나의 주문 줄을 최근 주문부터 한 쪽에 10줄씩 보여 준다. 지난달 이 화면을 회사 공통 페이징 함수로 옮긴 뒤로 "1쪽은 나오는데 2쪽을 누르면 빈 화면이 뜬다"는 말이 나왔다. 조민우가 재 보니 빈 화면이 1쪽보다 오히려 오래 걸린다.
공통 페이징 함수는 원래 SQL을 인라인 뷰로 감싸고 바깥에 WHERE ROWNUM BETWEEN :lo AND :hi를 붙인다. 1쪽은 1 ~ 10, 2쪽은 11 ~ 20이다. 상품관리팀과 고객센터가 하루 약 6천 번 연다.
T_ORD_DET 주문상세: 200,000행 · 896블록 · ORD_SEQ · ORD_DET_NO · ITM_ID · ORD_QTY · UNT_PRC · PK_T_ORD_DET (ORD_SEQ, ORD_DET_NO) · 상품 100개, 상품마다 약 2,000줄IX_T_ORD_DET_ITM (ITM_ID, ORD_SEQ, ORD_DET_NO): 이 화면용 · BLEVEL 1 · 리프 약 560블록 · 아래 계획은 주문 줄이 1,987줄인 상품이다. 통계는 최신이다.SELECT ORD_SEQ, ORD_DET_NO, ORD_QTY, UNT_PRC
FROM (SELECT ORD_SEQ, ORD_DET_NO, ORD_QTY, UNT_PRC
FROM T_ORD_DET
WHERE ITM_ID = :itm
ORDER BY ORD_SEQ DESC, ORD_DET_NO DESC)
WHERE ROWNUM BETWEEN :lo AND :hi -- 공통 페이징 함수가 붙인다 (2쪽 = 11 ~ 20)
[1쪽 · :lo = 1, :hi = 10]
----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 10 |00:00:00.01 | 12 |
|* 1 | COUNT STOPKEY | | 1 | | 10 |00:00:00.01 | 12 |
|* 2 | FILTER | | 1 | | 10 |00:00:00.01 | 12 |
| 3 | VIEW | | 1 | 10 | 10 |00:00:00.01 | 12 |
| 4 | TABLE ACCESS BY INDEX ROWID | T_ORD_DET | 1 | 2000 | 10 |00:00:00.01 | 12 |
|* 5 | INDEX RANGE SCAN DESCENDING | IX_T_ORD_DET_ITM | 1 | 10 | 10 |00:00:00.01 | 2 |
----------------------------------------------------------------------------------------------------------------
[2쪽 · :lo = 11, :hi = 20]
----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 0 |00:00:00.02 | 804 |
|* 1 | COUNT STOPKEY | | 1 | | 0 |00:00:00.02 | 804 |
|* 2 | FILTER | | 1 | | 0 |00:00:00.02 | 804 |
| 3 | VIEW | | 1 | 20 | 1987 |00:00:00.02 | 804 |
| 4 | TABLE ACCESS BY INDEX ROWID | T_ORD_DET | 1 | 2000 | 1987 |00:00:00.02 | 804 |
|* 5 | INDEX RANGE SCAN DESCENDING | IX_T_ORD_DET_ITM | 1 | 20 | 1987 |00:00:00.01 | 7 |
----------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(ROWNUM<=:HI)
2 - filter(ROWNUM>=:LO)
5 - access("ITM_ID"=:ITM)
ROWNUM이 매겨지는 방식과 2번 줄 FILTER로 설명하시오.