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

「상품 코드 오류 점검」이 마스터에 멀쩡히 있는 매장 제조 음료를 날마다 700줄 넘게 잡는다

중급SELECT유통279 / 700

상황 ​

본사 전산실의 「상품 코드 오류 점검」은 매일 아침 어제 판매상품 가운데 상품 마스터(CF01)에 없는 상품번호로 찍힌 줄을 찾는다. POS 메뉴 동기화가 늦은 날 마스터에 없는 번호가 찍히는 일이 있어서 만든 점검이다. 지난주 점검표 양식에서 상품명 칸을 빼면서 SQL도 정리했는데, 그 뒤로 날마다 700줄 넘게 '코드 오류'로 나온다. 확인해 보니 아메리카노와 카페라테처럼 마스터에 멀쩡히 있는 매장 제조 음료의 줄이었다. 예전 점검표는 거래처 이름을 함께 보여 줘서 조인에 PTNR_NO를 쓰고 있었고, 정리하면서 IS NULL 조건도 그 컬럼에 걸었다.

테이블과 인덱스 ​

  • CF11 판매상품: 1,096,708행 · 8,204블록 · CF11_PK (SLE_NO, ITM_NO): BLEVEL 2 · SLE_NO는 'YYYYMMDD-NNNN'이라 앞 8자리가 판매일
  • CF01 상품: 109행 · 5블록 · CF01_PK (ITM_NO) · 매장 제조 상품 41개는 거래처가 없어 PTNR_NO가 NULL이다
  • 2023-12-18 판매상품 1,512줄 가운데 매장 제조 상품 줄은 712줄이다 · 마스터에 없는 상품번호는 그날 0줄
  • 통계 최신 · 바인드 :v_from = '20231218', :v_to = '20231219'

원본 SQL ​

sql
SELECT d.SLE_NO, d.ITM_NO, d.SLE_QTY
  FROM CF11 d
  LEFT OUTER JOIN CF01 p
    ON p.ITM_NO = d.ITM_NO
 WHERE d.SLE_NO >= :v_from
   AND d.SLE_NO <  :v_to
   AND p.PTNR_NO IS NULL
 ORDER BY d.SLE_NO, d.ITM_NO

실행계획 학습용 예시 ​

xplan
---------------------------------------------------------------------------------------------------------
| Id  | Operation                              | Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |         |      1 |        |    712 |00:00:00.01 |      26 |
|   1 |  SORT ORDER BY                         |         |      1 |    560 |    712 |00:00:00.01 |      26 |
|*  2 |   FILTER                               |         |      1 |        |    712 |00:00:00.01 |      26 |
|*  3 |    HASH JOIN RIGHT OUTER               |         |      1 |   1490 |   1512 |00:00:00.01 |      26 |
|   4 |     TABLE ACCESS FULL                  | CF01    |      1 |    109 |    109 |00:00:00.01 |       5 |
|   5 |     TABLE ACCESS BY INDEX ROWID BATCHED| CF11    |      1 |   1490 |   1512 |00:00:00.01 |      21 |
|*  6 |      INDEX RANGE SCAN                  | CF11_PK |      1 |   1490 |   1512 |00:00:00.01 |       8 |
---------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter("P"."PTNR_NO" IS NULL)
   3 - access("P"."ITM_NO"="D"."ITM_NO")
   6 - access("D"."SLE_NO">=:V_FROM AND "D"."SLE_NO"<:V_TO)

문제 ​

  1. 마스터에 멀쩡히 있는 매장 제조 음료가 '코드 오류'로 나온 까닭을 외부 조인 결과의 NULL로 설명하시오. 실행계획 2번과 3번 줄도 함께 설명하시오.
  2. 마스터에 없는 상품번호만 고르도록 SQL을 고치고, 고친 SQL의 계획이 어떻게 바뀔지 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자