Skip to content
튜닝 연습서브쿼리와 쿼리 변환
SUBQ-043

「판매 이력 없는 상품」을 지운 다음 날 발주 화면에서 원재료 20개가 사라졌다

중급DELETE유통278 / 700

상황 ​

본사 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) · 샷추가는 옵션 가격이 등록되어 있다
  • 이 문제에서 상품번호를 참조하는 테이블은 위 다섯 개로 본다 · FK 없음 · 통계 최신

원본 SQL ​

sql
DELETE FROM CF01 p
 WHERE p.ITM_NO NOT IN (SELECT d.ITM_NO FROM CF11 d)

실행계획 학습용 예시 · 상품 수는 적재 데이터 그대로 ​

xplan
----------------------------------------------------------------------------------------------
| 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

문제 ​

  1. 원래 DELETE가 원재료 20개를 지운 까닭을 SQL의 뜻으로 설명하시오. FK가 없는 DB에서 '쓰이지 않는 상품'을 판정하려면 무엇을 확인해야 하는지도 쓰시오.
  2. 어디에서도 쓰이지 않는 상품만 지우도록 DELETE를 고치고, 실행계획에서 각 안티 조인이 어떻게 처리될지 설명하시오.
  3. 이 배치를 위해 CF11 (ITM_NO) 인덱스를 만들지 판단하고 그 근거를 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자