테마
본사 MD팀은 상품 마스터를 정리하려고 '판매된 적이 한 번도 없는 상품'을 CF01에서 지우는 월 배치를 만들었다. 지난주 처음 돌렸더니 21개가 지워졌다. 다음 날 아침 발주 화면과 재고 화면에서 원두와 우유 같은 원재료 20개가 '상품 없음'으로 나와 구매팀이 발주를 넣지 못했다. DBA가 백업에서 21개를 되살렸고, MD팀은 SQL을 다시 짜 달라고 했다.
유통 DB에는 FK가 하나도 없어서, 지우는 순간 막아 주는 것이 없었다.
CF01 상품: 109행 · 5블록 · CF01_PK (ITM_NO) · 판매 상품 88개 · 샷추가 1개 · 원재료 20개CF11 판매상품: 1,096,708행 · 8,204블록 · CF11_PK (SLE_NO, ITM_NO): BLEVEL 2 · 리프 약 4,290블록 · 원재료 20개와 샷추가는 판매상품에 한 번도 나오지 않는다CF13 발주상품: 7,102행 · 57블록 · CF13_PK (ORD_NO, ITM_NO) · 원재료 20개는 다달이 발주된다CF15 입출고상품: 51,497행 · 349블록 · CF15_PK (INOUT_NO, ITM_NO)(리프 약 190블록) · 원재료가 입고될 때마다 쌓인다CF18 일별상품재고: 408행 · 6블록 · PK (SHP_NO, ITM_NO, INV_BS_DT) · CF05 상품가격: 157행 · 5블록 · PK (ITM_NO, UPRC_KN_CD, APL_DT) · 샷추가는 옵션 가격이 등록되어 있다DELETE FROM CF01 p
WHERE p.ITM_NO NOT IN (SELECT d.ITM_NO FROM CF11 d)
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
----------------------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | | 0 |00:00:00.22 | 4342 |
| 1 | DELETE | CF01 | 1 | | 0 |00:00:00.22 | 4342 |
|* 2 | HASH JOIN ANTI | | 1 | 1 | 21 |00:00:00.21 | 4310 |
| 3 | TABLE ACCESS FULL | CF01 | 1 | 109 | 109 |00:00:00.01 | 5 |
| 4 | INDEX FAST FULL SCAN| CF11_PK | 1 | 1096K| 1096K|00:00:00.20 | 4305 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("P"."ITM_NO"="D"."ITM_NO")
[결과] 21행 삭제 = 원재료 20 + 샷추가 1
CF11 (ITM_NO) 인덱스를 만들지 판단하고 그 근거를 쓰시오.