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

카테고리 개편 뒤 상품 등록 화면의 카테고리 목록이 비었다

기초SELECT유통238 / 700

상황 ​

본사 MD가 쓰는 「신상품 등록」 화면의 카테고리 선택 목록에는 하위가 없는 카테고리(말단)만 나온다. 예전에는 맨 위에 '전체(0)' 하나를 두고 그 UP_CTG_NO를 자기 자신(0)으로 채워 두었다. 지난주 개편에서 '전체'를 없애고 최상위 4개(음료, 푸드, 굿즈, 기타)의 UP_CTG_NO를 비워 둔 날부터 목록이 비었다. 개발자는 "개편 데이터가 잘못 들어갔다. 예전처럼 최상위의 UP_CTG_NO를 0으로 채워 달라"라고 한다.

테이블과 인덱스 ​

  • CF02 카테고리: 18행 · 4블록 · CF02_PK (CTG_NO) · UP_CTG_NO 자기 참조 (NULL 허용)
  • 최상위 4개(100 음료 · 200 푸드 · 300 굿즈 · 900 기타)는 부모가 없어 UP_CTG_NO가 NULL이고, 나머지 14개는 최상위 중 하나를 가리킨다
  • 통계 최신

원본 SQL ​

sql
SELECT c.CTG_NO, c.CTG_NM
  FROM CF02 c
 WHERE c.CTG_NO NOT IN (SELECT s.UP_CTG_NO FROM CF02 s)
 ORDER BY c.CTG_NO

실행계획 학습용 예시 · 행 수는 실데이터 ​

xplan
---------------------------------------------------------------------------------------------------------------
| Id  | Operation           | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
---------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |      1 |        |      0 |00:00:00.01 |       8 |       |       |          |
|   1 |  SORT ORDER BY      |      |      1 |     14 |      0 |00:00:00.01 |       8 |  1024 |  1024 |          |
|*  2 |   HASH JOIN ANTI NA |      |      1 |     14 |      0 |00:00:00.01 |       8 |  2078K|  2078K| 1227K (0)|
|   3 |    TABLE ACCESS FULL| CF02 |      1 |     18 |     18 |00:00:00.01 |       4 |       |       |          |
|   4 |    TABLE ACCESS FULL| CF02 |      1 |     18 |     18 |00:00:00.01 |       4 |       |       |          |
---------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("C"."CTG_NO"="S"."UP_CTG_NO")

문제 ​

  1. 결과가 0건인 이유를 NOT IN의 뜻으로 설명하시오. 계획 2번 줄의 ANTI NA가 무엇을 지켰는지도 설명하시오.
  2. 말단 14개가 나오도록 SQL을 고치시오. 개발자의 제안(최상위의 UP_CTG_NO를 0으로 채우기)이 왜 답이 아닌지도 쓰시오.
  3. 이 표는 작아서 블록 차이가 없다. NA 안티 조인이 없던 버전에서는 큰 표의 NOT IN이 어떤 계획으로 돌았고 일량이 어떠했는지 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자