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

거래처 한 곳을 거래 정지로 등록한 다음 날, POS 메뉴에서 매장 제조 음료가 모두 사라졌다

기초SELECT유통268 / 700

상황 ​

본사 전산실은 매일 06시에 「판매 가능 상품」 목록을 다섯 매장의 POS 메뉴로 내려보낸다. 지난달 구매팀 요청으로 "거래 정지된 거래처의 상품은 팔지 않는다"는 조건을 SQL에 한 줄 더해 배포했고, 3주 동안 아무 일이 없었다. 어제 오후 구매팀이 처음으로 거래처 한 곳(7번)을 거래 정지로 등록했다. 오늘 아침 모든 매장 POS에서 아메리카노와 카페라테를 비롯한 매장 제조 음료가 메뉴에서 사라졌다. 빠져야 할 것은 거래처 7의 상품 5개뿐이었다.

테이블과 인덱스 ​

  • CF01 상품: 109행 · 5블록 · CF01_PK (ITM_NO) · 판매 중(SLE_YN = 'Y') 88개 = 매장 제조 음료와 디저트 41개 + 거래처 상품 47개
  • 매장 제조 상품 41개는 거래처가 없어 PTNR_NO가 NULL이다(나머지 상품은 모두 거래처 번호가 있다)
  • CF_PTNR_STOP 거래 정지 거래처: 이 기능을 위해 만든 표 · PTNR_NO NUMBER(PK라 NOT NULL) · STOP_DT · 어제까지 0행, 지금 1행(거래처 7) · CF_PTNR_STOP_PK 1블록
  • 거래처 7의 판매 상품은 5개다 · 통계 최신

원본 SQL ​

sql
SELECT i.ITM_NO, i.ITM_NM, i.CTG_NO
  FROM CF01 i
 WHERE i.SLE_YN = 'Y'
   AND i.PTNR_NO NOT IN (SELECT s.PTNR_NO FROM CF_PTNR_STOP s)
 ORDER BY i.ITM_NO

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

xplan
----------------------------------------------------------------------------------------------------
| Id  | Operation            | Name            | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |                 |      1 |        |     42 |00:00:00.01 |       6 |
|   1 |  SORT ORDER BY       |                 |      1 |     87 |     42 |00:00:00.01 |       6 |
|*  2 |   HASH JOIN ANTI SNA |                 |      1 |     87 |     42 |00:00:00.01 |       6 |
|*  3 |    TABLE ACCESS FULL | CF01            |      1 |     88 |     88 |00:00:00.01 |       5 |
|   4 |    INDEX FULL SCAN   | CF_PTNR_STOP_PK |      1 |      1 |      1 |00:00:00.01 |       1 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("I"."PTNR_NO"="S"."PTNR_NO")
   3 - filter("I"."SLE_YN"='Y')

[어제까지 · CF_PTNR_STOP 0행]  같은 계획 · 결과 88개

문제 ​

  1. 3주 동안 멀쩡하던 SQL이 거래처 한 곳을 등록한 다음 날부터 매장 제조 음료를 빠뜨린 까닭을 NOT IN의 뜻으로 설명하시오. 실행계획 2번 줄의 SNA가 무엇인지도 설명하시오.
  2. 거래처 7의 상품만 빠지도록 SQL을 고치시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자