테마
가맹점주 앱 첫 화면의 「최근 주문 20건」은 매장의 최근 주문 20건과 주문마다 수량 합계를 보여 준다. 점주 200명이 하루 평균 50번씩 연다. 지난 주말 DB를 11g에서 19c로 올린 다음 날부터 한 번에 2.4초가 걸린다. SQL과 인덱스는 바꾸지 않았다. 업그레이드 전 계획을 보관해 둔 오과장의 메모에는 "11g: INDEX RANGE SCAN DESCENDING, 스칼라 서브쿼리 Starts 20, Buffers 104"라고 적혀 있다.
ORD: 1,000,000행 · 22,422블록 · 매장마다 약 5,000건 · ORD_X02 (SHOP_NO, ORD_DT, ORD_HMS)(이 화면용)ORD_ITEM: 2,472,717행 · 55,265블록 · 주문당 1 ~ 4줄(같은 주문의 줄은 같은 블록에 있다) · ORD_ITEM_PK (ORD_NO, ITEM_ID)_optimizer_unnest_scalar_sq)이 기본으로 켜져 있다 · 통계 최신 · 아래는 :shop = 'SH0001'SELECT *
FROM (SELECT o.ORD_NO, o.ORD_DT, o.ORD_HMS,
(SELECT SUM(i.ORD_ITEM_QTY)
FROM ORD_ITEM i
WHERE i.ORD_NO = o.ORD_NO) AS qty
FROM ORD o
WHERE o.SHOP_NO = :shop
ORDER BY o.ORD_DT DESC, o.ORD_HMS DESC)
WHERE ROWNUM <= 20
---------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | Used-Mem |
---------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 20 |00:00:02.41 | 60310 | 55265 | |
|* 1 | COUNT STOPKEY | | 1 | | 20 |00:00:02.41 | 60310 | 55265 | |
| 2 | VIEW | | 1 | 5000 | 20 |00:00:02.41 | 60310 | 55265 | |
|* 3 | SORT ORDER BY STOPKEY | | 1 | 5000 | 20 |00:00:02.41 | 60310 | 55265 | 6144 (0) |
|* 4 | HASH JOIN OUTER | | 1 | 5000 | 5000 |00:00:02.40 | 60310 | 55265 | 1517K (0)|
| 5 | TABLE ACCESS BY INDEX ROWID BATCHED| ORD | 1 | 5000 | 5000 |00:00:00.02 | 5045 | 0 | |
|* 6 | INDEX RANGE SCAN | ORD_X02 | 1 | 5000 | 5000 |00:00:00.01 | 21 | 0 | |
| 7 | VIEW | VW_SSQ_1 | 1 | 1000K| 1000K|00:00:02.10 | 55265 | 55265 | |
| 8 | HASH GROUP BY | | 1 | 1000K| 1000K|00:00:01.95 | 55265 | 55265 | 71M (0)|
| 9 | TABLE ACCESS FULL | ORD_ITEM | 1 | 2472K| 2472K|00:00:00.52 | 55265 | 55265 | |
---------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(ROWNUM<=20)
3 - filter(ROWNUM<=20)
4 - access("ITEM_1"(+)="O"."ORD_NO")
6 - access("O"."SHOP_NO"=:SHOP)
NO_UNNEST만 넣는 것으로 충분한지 쓰시오.