테마
정산팀은 매달 초 지난달 주문 전체를 내려받아 회계 시스템과 대사한다. 파일에는 취소 주문의 취소 사유 칸이 있다. 6월 치 27,390건을 한 번 내려받을 때 6만 블록을 읽고, 담당자 다섯 명이 월초 사흘 동안 수십 번씩 내려받아 그 기간에는 이 SQL이 논리 읽기 상위에 오른다. SQL을 짠 조민우는 "취소 사유는 스칼라 서브쿼리로 붙였다. 취소가 아닌 주문은 사유가 없어 NULL이 나오고, 캐시도 있으니 문제없다"라고 했다.
T_ORD_BIG: 1,000,000행 · 5,826블록 · 인덱스 없음 · 2024년 6월 27,390건 · ORD_ST CANCEL 2%(6월은 549건) · ORD_SEQ는 주문마다 다르다T_ORD_CNCL 주문취소(이 문제에서 쓰는 파생 테이블): T_ORD_BIG의 취소 주문 20,000건 · 2,860블록 · PK_T_ORD_CNCL (ORD_SEQ)(높이 2) · CNCL_DT · CNCL_RSN(사유 문구) · CNCL_MEMO(상담원 메모, 평균 900바이트라 행이 길다)T_ORD_CNCL의 행을 지우고 주문 상태를 되돌린다"이다 · FK도 제약도 없다 · 통계 최신SELECT o.ORD_SEQ, o.CUS_ID, o.ORD_DT, o.ORD_ST, o.ORD_AMT,
(SELECT c.CNCL_RSN
FROM T_ORD_CNCL c
WHERE c.ORD_SEQ = o.ORD_SEQ) AS cncl_rsn
FROM T_ORD_BIG o
WHERE o.ORD_DT >= DATE '2024-06-01'
AND o.ORD_DT < DATE '2024-07-01'
ORDER BY o.ORD_SEQ
-------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Used-Mem |
-------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 27390 |00:00:00.31 | 61155 | |
| 1 | TABLE ACCESS BY INDEX ROWID| T_ORD_CNCL | 27390 | 1 | 549 |00:00:00.17 | 55329 | |
|* 2 | INDEX UNIQUE SCAN | PK_T_ORD_CNCL | 27390 | 1 | 549 |00:00:00.08 | 54780 | |
| 3 | SORT ORDER BY | | 1 | 27390 | 27390 |00:00:00.31 | 61155 | 1726K (0)|
|* 4 | TABLE ACCESS FULL | T_ORD_BIG | 1 | 27390 | 27390 |00:00:00.05 | 5826 | |
-------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("C"."ORD_SEQ"=:B1)
4 - filter(("O"."ORD_DT">=TO_DATE(' 2024-06-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND
"O"."ORD_DT"<TO_DATE(' 2024-07-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss')))