테마
CRM팀 상담 화면의 「VIP 이달 구매 상품」 탭은 A 등급 고객 20명이 이번 달에 산 상품을 주문일, 고객명, 상품명, 수량, 금액으로 보여 준다. 상담원 40명이 하루 1,500번쯤 연다.
지난달 조민우가 만들었다. 처음 돌려 보니 해시 조인이 나와서 "화면 조회는 NL이 맞다"며 FROM 절에 적은 순서 그대로 LEADING과 USE_NL을 붙였다. 아래는 2024년 6월로 조회한 실행계획이다.
T_ORD: 100,000행 · 896블록 · PK_T_ORD (ORD_SEQ) · ORD_DT 인덱스 없음 · 한 달 주문은 테이블 전체에 흩어져 있다 · 2024년 6월 4,172건, 그중 A 등급 고객의 주문 41건T_ORD_DET: 200,000행 · 896블록 · PK_T_ORD_DET (ORD_SEQ, ORD_DET_NO) BLEVEL 1 · 주문당 1 ~ 3줄(평균 2줄) · 6월 주문의 상세 8,355줄, A 등급 고객 몫 83줄M_ITM: 100행 · 5블록 · PK_M_ITM (ITM_ID)M_CUS: 2,000행 · 30블록 · PK_M_CUS (CUS_ID) · CUS_GD A 20명(1%) · B 180명 · C 1,800명 · CUS_GD에 히스토그램 있음SELECT /*+ LEADING(o d i c) USE_NL(d i c) */
o.ORD_DT, c.CUS_NM, i.ITM_NM, d.ORD_QTY, d.ORD_QTY * d.UNT_PRC AS amt
FROM T_ORD o, T_ORD_DET d, M_ITM i, M_CUS c
WHERE o.ORD_DT >= :v_from
AND o.ORD_DT < :v_to
AND d.ORD_SEQ = o.ORD_SEQ
AND i.ITM_ID = d.ITM_ID
AND c.CUS_ID = o.CUS_ID
AND c.CUS_GD = 'A'
ORDER BY o.ORD_DT DESC, c.CUS_NM
------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Used-Mem |
------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 83 |00:00:00.29 | 46562 | |
| 1 | SORT ORDER BY | | 1 | 84 | 83 |00:00:00.29 | 46562 | 13312 (0) |
| 2 | NESTED LOOPS | | 1 | 84 | 83 |00:00:00.29 | 46562 | |
| 3 | NESTED LOOPS | | 1 | 8344 | 8355 |00:00:00.19 | 29848 | |
| 4 | NESTED LOOPS | | 1 | 8344 | 8355 |00:00:00.11 | 13138 | |
|* 5 | TABLE ACCESS FULL | T_ORD | 1 | 4172 | 4172 |00:00:00.01 | 896 | |
| 6 | TABLE ACCESS BY INDEX ROWID | T_ORD_DET | 4172 | 2 | 8355 |00:00:00.08 | 12242 | |
|* 7 | INDEX RANGE SCAN | PK_T_ORD_DET | 4172 | 2 | 8355 |00:00:00.04 | 8344 | |
| 8 | TABLE ACCESS BY INDEX ROWID | M_ITM | 8355 | 1 | 8355 |00:00:00.05 | 16710 | |
|* 9 | INDEX UNIQUE SCAN | PK_M_ITM | 8355 | 1 | 8355 |00:00:00.02 | 8355 | |
|* 10 | TABLE ACCESS BY INDEX ROWID | M_CUS | 8355 | 1 | 83 |00:00:00.08 | 16714 | |
|* 11 | INDEX UNIQUE SCAN | PK_M_CUS | 8355 | 1 | 8355 |00:00:00.03 | 8359 | |
------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - filter(("O"."ORD_DT">=:V_FROM AND "O"."ORD_DT"<:V_TO))
7 - access("D"."ORD_SEQ"="O"."ORD_SEQ")
9 - access("I"."ITM_ID"="D"."ITM_ID")
10 - filter("C"."CUS_GD"='A')
11 - access("C"."CUS_ID"="O"."CUS_ID")
CUS_GD = 'A')이 실행계획의 몇 번 줄에서 적용되는지 짚고, 46,562블록이 어디서 나오는지 Starts와 Buffers로 설명하시오.