Skip to content
튜닝 연습조인 튜닝
JOIN-024

상품 88개의 2년 판매 합계를 내려고 판매상품 110만 줄을 하나씩 상품 마스터에 맞대 본다

기초SELECT유통174 / 700

상황 ​

상품팀의 「상품별 누적 판매」는 2년 치 판매상품을 상품마다 묶어 상품명과 분류, 판매 줄 수, 수량, 금액을 낸다. 상품 관리 화면 첫 페이지에 붙어 있어 하루 3천 번쯤 호출된다. 실행계획은 해시 조인이고 Buffers도 두 테이블을 한 번씩 읽은 만큼이다. 그런데 AWR의 CPU 상위에 이 SQL이 올라 있다. 오과장은 "블록을 더 줄일 데가 없으면 그대로 둬야 하나"라고 묻는다.

테이블과 인덱스 ​

  • CF01 상품: 109행 · 5블록 · CF01_PK (ITM_NO) · 판매상품 88 · 추가상품 1 · 원재료 20
  • CF11 판매상품: 1,096,708행 · 8,204블록 · CF11_PK (SLE_NO, ITM_NO) · 판매 기록이 있는 상품은 88개
  • 통계 최신 · 아래 CPU는 같은 SQL을 10번 돌려 잰 CPU used by this session의 한 번 평균

원본 SQL ​

sql
SELECT p.ITM_NO, p.ITM_NM, p.ITM_CL_CD,
       COUNT(*) AS sle_lines, SUM(i.SLE_QTY) AS sle_qty,
       SUM(i.SLE_QTY * i.SLE_UPRC) AS sle_amt
  FROM CF01 p, CF11 i
 WHERE i.ITM_NO = p.ITM_NO
 GROUP BY p.ITM_NO, p.ITM_NM, p.ITM_CL_CD

실행계획 학습용 예시 · CPU 비율은 교재 18화 Q2 rev02 실측을 참고 ​

xplan
-------------------------------------------------------------------------------------------------
| Id  | Operation           | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Used-Mem |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |      1 |        |     88 |00:00:00.41 |    8209 |          |
|   1 |  HASH GROUP BY      |      |      1 |    109 |     88 |00:00:00.41 |    8209 | 1269K (0)|
|*  2 |   HASH JOIN         |      |      1 |   1096K|   1096K|00:00:00.29 |    8209 | 1321K (0)|
|   3 |    TABLE ACCESS FULL| CF01 |      1 |    109 |    109 |00:00:00.01 |       5 |          |
|   4 |    TABLE ACCESS FULL| CF11 |      1 |   1096K|   1096K|00:00:00.06 |    8204 |          |
-------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("I"."ITM_NO"="P"."ITM_NO")

[한 번 실행]  CPU used by this session  39 cs

문제 ​

  1. 2번 줄의 A-Rows로 이 SQL이 해시 조인에서 몇 번 짝을 맞춰 보는지 설명하고, Buffers가 작은데 CPU가 드는 이유를 서술하시오.
  2. 결과가 바뀌지 않게 SQL을 고쳐 조인에 대는 행을 줄이시오. 고친 SQL의 결과가 원본과 같은 근거도 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자