테마
정산팀의 「미정산 주문」 화면은 결제가 끝났는데 아직 정산 행이 없는 주문을 최근 주문부터 20건씩 보여 준다. 정산 담당 10명이 새로 고치고 다음 쪽을 넘기며 하루 3,000번쯤 연다. 한 번에 0.05초라 아무도 불평하지 않지만, DBA의 상위 SQL 목록에서 이 화면이 하루 논리 읽기 약 461만 블록으로 3위에 올라 있다. 박팀장은 인덱스를 만들어도 좋다고 했다. 다만 밤마다 정산 테이블을 통째로 다시 넣는 적재 배치에 주는 영향과, 마지막 쪽에서 무슨 일이 생기는지까지 숫자로 적어 오라고 했다.
T_ORD: 100,000행 · 896블록 · PK_T_ORD (ORD_SEQ) · COMPLETE 90,000행 · 오늘(2024-12-31) 주문 136건과 어제 주문 136건은 모두 COMPLETE · 하루치 주문은 테이블 전체에 흩어져 있다(ORD_SEQ가 주문 시각 순이 아니다)T_ORD_STLM: 99,864행 · 640블록 · 인덱스 없음 · 01시 정산 적재 배치가 TRUNCATE 뒤 INSERT /*+ APPEND */로 전날까지의 결제분 전부를 다시 넣는다(0.1초 안팎)SELECT *
FROM (SELECT o.ORD_SEQ, o.CUS_ID, o.ORD_DT, o.PAY_DT, o.PAY_AMT
FROM T_ORD o
WHERE o.ORD_ST = 'COMPLETE'
AND NOT EXISTS (SELECT 1 FROM T_ORD_STLM s WHERE s.ORD_SEQ = o.ORD_SEQ)
ORDER BY o.ORD_DT DESC)
WHERE ROWNUM <= 20
-------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Used-Mem |
-------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 20 |00:00:00.05 | 1536 | |
|* 1 | COUNT STOPKEY | | 1 | | 20 |00:00:00.05 | 1536 | |
| 2 | VIEW | | 1 | 136 | 20 |00:00:00.05 | 1536 | |
|* 3 | SORT ORDER BY STOPKEY| | 1 | 136 | 20 |00:00:00.05 | 1536 | 2048 (0)|
|* 4 | HASH JOIN RIGHT ANTI| | 1 | 136 | 136 |00:00:00.05 | 1536 | 5932K (0)|
| 5 | TABLE ACCESS FULL | T_ORD_STLM | 1 | 99864 | 99864 |00:00:00.01 | 640 | |
|* 6 | TABLE ACCESS FULL | T_ORD | 1 | 90000 | 90000 |00:00:00.01 | 896 | |
-------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(ROWNUM<=20)
3 - filter(ROWNUM<=20)
4 - access("S"."ORD_SEQ"="O"."ORD_SEQ")
6 - filter("O"."ORD_ST"='COMPLETE')