테마
상품팀의 「상품 판매 분포」는 상품 하나를 고르면 2년 치 판매를 매장과 요일로 나눠 보여 준다. 시즌 메뉴를 검토하는 회의 전에 상품을 바꿔 가며 돌리고, 매장 다섯 곳의 점장도 아침마다 연다.
개발팀 코딩 규칙에 "헤더 → 상세 순서로 조인한다"가 있어서 판매 헤더부터 읽도록 힌트가 붙어 있다. 아침 9시 무렵 여러 명이 함께 열면 PGA 사용량이 수백 MB로 뛴다는 DBA 보고가 있었다. 아래는 시즌 메뉴(ITM_NO = 1047) 하나로 조회한 실행계획이다.
CF10 판매: 500,000행 · 4,583블록 · CF10_PK (SLE_NO) · SHP_NO 5곳 · SLE_DOW 1 ~ 7CF11 판매상품: 1,096,708행 · 8,204블록 · CF11_PK (SLE_NO, ITM_NO) · ITM_NO만으로 찾는 인덱스는 없다 · ITM_NO = 1047은 2년 동안 8,512줄이다SELECT /*+ LEADING(a b) USE_HASH(b) */
a.SHP_NO, a.SLE_DOW, COUNT(*) AS sle_lines, SUM(b.SLE_QTY) AS sle_qty
FROM CF10 a, CF11 b
WHERE b.ITM_NO = :v_itm
AND b.SLE_NO = a.SLE_NO
GROUP BY a.SHP_NO, a.SLE_DOW
--------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 35 |00:00:00.31 | 12787 | | | |
| 1 | HASH GROUP BY | | 1 | 35 | 35 |00:00:00.31 | 12787 | 1200K| 1200K| 961K (0)|
|* 2 | HASH JOIN | | 1 | 12463 | 8512 |00:00:00.30 | 12787 | 29M| 4671K| 33M (0)|
| 3 | TABLE ACCESS FULL| CF10 | 1 | 500K| 500K|00:00:00.04 | 4583 | | | |
|* 4 | TABLE ACCESS FULL| CF11 | 1 | 12463 | 8512 |00:00:00.07 | 8204 | | | |
--------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("B"."SLE_NO"="A"."SLE_NO")
4 - filter("B"."ITM_NO"=:V_ITM)
CF11 → CF10_PK)으로 바꾸는 안과 Buffers를 비교하시오.