테마
CRM팀은 매주 월요일 06시에 추천 엔진으로 넘길 「고객별 최근 주문 n건」을 추출한다. 평소에는 3건이다. 지난달 데이터팀이 "분기마다 한두 번은 고객의 주문을 전부 순번과 함께 받고 싶다"고 해서, 개발자가 n에 0을 넣으면 전부 나오도록 조건을 고쳤다. 그 뒤로 평소의 3건 추출이 0.4초에서 2.6초로 늘었고, 돌 때마다 TEMP를 37MB 쓴다. 같은 시각에 정산 배치가 돌아서 DBA는 TEMP 경보를 받는다.
T_ORD_BIG: 1,000,000행 · 5,826블록 · 고객 2,000명(고객마다 약 500건) · ORD_DT DATE(전부 자정) · ORD_SEQ 유일 · 한 고객의 주문은 테이블 곳곳의 블록에 흩어져 있다IX_ORD_BIG_CUS_DT (CUS_ID, ORD_DT): CS 화면용 · BLEVEL 2 · 리프 약 3,000블록 · 통계 최신:n = 3 추출은 매주, :n = 0(전부) 추출은 분기에 한두 번 돈다SELECT CUS_ID, ORD_SEQ, ORD_DT, ORD_AMT, rn
FROM (SELECT o.CUS_ID, o.ORD_SEQ, o.ORD_DT, o.ORD_AMT,
ROW_NUMBER() OVER (PARTITION BY o.CUS_ID
ORDER BY o.ORD_DT DESC, o.ORD_SEQ DESC) AS rn
FROM T_ORD_BIG o)
WHERE (:n = 0 OR rn <= :n)
[지금 · :n = 3 · 월요일 06:00]
-----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | Used-Mem | Used-Tmp|
-----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 6000 |00:00:02.63 | 5826 | | | |
|* 1 | VIEW | | 1 | 50000 | 6000 |00:00:02.63 | 5826 | | | |
| 2 | WINDOW SORT | | 1 | 1000K| 1000K|00:00:02.41 | 5826 | 44M| 20M (1)| 37M|
| 3 | TABLE ACCESS FULL | T_ORD_BIG | 1 | 1000K| 1000K|00:00:00.06 | 5826 | | | |
-----------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter((:N=0 OR "RN"<=:N))
[지난달까지 · WHERE rn <= :n · :n = 3 · 같은 시각]
2번 줄이 WINDOW SORT PUSHED RANK · A-Rows 6000 · Used-Mem 410K (0) · Used-Tmp 없음 · A-Time 0.38초 · Buffers 5,826
2 - filter(ROW_NUMBER() OVER ( PARTITION BY "O"."CUS_ID" ORDER BY INTERNAL_FUNCTION("O"."ORD_DT") DESC ,
INTERNAL_FUNCTION("O"."ORD_SEQ") DESC )<=:N)
IX_ORD_BIG_CUS_DT를 쓰지 않는 편이 나은 이유를 쓰시오.