테마
구매팀의 「원재료 입출고 집계」는 원재료 20종마다 입출고 줄 수와 수량 합계를 낸다. 하루 수십 번 돌린다. SQL은 「상품 하나의 입출고 이력」 화면의 SQL을 복사해 조건만 바꾼 것이라 힌트도 그대로 붙어 있다.
조민우는 실행계획을 보고 "CF15에 ITM_NO 인덱스를 만들면 해결된다"라며 인덱스 생성 요청서를 올렸다. 오과장은 요청서를 받아들일지 숫자로 판단해 달라고 했다.
CF01 상품: 109행 · 5블록 · CF01_PK (ITM_NO) · 원재료(ITM_CL_CD = '102') 20개CF15 입출고상품: 51,497행 · 349블록 · PK (INOUT_NO, ITM_NO) · 보조 인덱스 없음SELECT /*+ LEADING(p) USE_NL(i) */
p.ITM_NO, p.ITM_NM, COUNT(*) AS io_lines, SUM(i.INOUT_QTY) AS io_qty
FROM CF01 p, CF15 i
WHERE p.ITM_CL_CD = '102'
AND i.ITM_NO = p.ITM_NO
GROUP BY p.ITM_NO, p.ITM_NM
---------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 20 |00:00:00.21 | 6985 |
| 1 | HASH GROUP BY | | 1 | 36 | 20 |00:00:00.21 | 6985 |
| 2 | NESTED LOOPS | | 1 | 27252 | 6201 |00:00:00.20 | 6985 |
|* 3 | TABLE ACCESS FULL | CF01 | 1 | 36 | 20 |00:00:00.01 | 5 |
|* 4 | TABLE ACCESS FULL | CF15 | 20 | 757 | 6201 |00:00:00.20 | 6980 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("P"."ITM_CL_CD"='102')
4 - filter("I"."ITM_NO"="P"."ITM_NO")
Starts로 설명하시오.CF15 (ITM_NO) 인덱스를 만들어 NL로 처리할 때와 해시 조인으로 처리할 때의 일량을 비교해, 인덱스 생성 요청을 받아들일지 정하고 개선 SQL을 작성하시오.