[SQLP실기풀이]4장 조인튜닝(4)-고급조인기법 53번

Yu River·2022년 6월 26일
0

SQLP실기연습

목록 보기
25/44

문제 링크 : https://velog.io/@yooha9621/SQLP실기문제53번

1) 쿼리 튜닝

1.부분 범위 처리

  • 실제 방문 일자를 기준으로 부분 범위 처리로 상위 10건을 추출하므로 드라이빙 테이블은 선두컬럼이 '실제 방문일자'인 작업지시 인덱스로 한다.

2.작업지시 테이블 액세스

  • 작업자ID를 '=' 조건으로 조회함과 동시에 실제 방문일자가 최신인 순으로 조회 조건을 만족하는 상위 10건을 추출할 수 있도록 부분범위 처리를 할 수 있는 인덱스를 설계한다.
    • 작업자ID + 실제 방문일자

3.개통접수 테이블 액세스

  • 작업지시 테이블로 부터 NL조인이 처리되므로 기존 개통접수_PK 인덱스를 이용한다.

4.장애접수 테이블 액세스

  • 작업지시 테이블로 부터 NL조인이 처리되므로 기존 장애접수_PK 인덱스를 이용한다.

4) 튜닝한 SQL문

[인덱스 추가]
작업지시_X1 : 작업자ID + 실제 방문일자
select *
from (SELECT /*+ LEADING(A) USE_NL(B) USE_NL(C) INDEX(A 작업지시_X1)*/ 
	A.작업일련번호 , A.실제방문일자 ,
    NVL2(A.개통접수번호,'개통','장애') 접수구분,
    NVL2(A.개통접수번호,B.고객번호,C.고객번호) 고객번호 ,
    NVL2(A.개통접수번호,B.주소,C.주소) 주소
  FROM 작업지시 A , 개통접수 B , 장애접수 C
  WHERE 작업자ID = 'Z123456'
  AND B.개통접수번호(+) = 개통접수번호
  AND C.장애접수번호(+) = 장애접수번호
  AND A.작업일자 >= TRUNC(ADD_MONTHS(SYSDATE , -1))
  ORDER BY 실제방문일자 DESC ) 
WHERE ROWNUM <= 10;

🍎 정리

  • 실제 방문일자를 기준으로 부분 범위 처리 하므로 '작업자ID' 액세스 조건 처리후
    정렬된 '실제방문일자'로 부분범위처리할 수 있는 인덱스를 드라이빙 테이블로 놓고 개통접수번호에 따라 '개통접수' 테이블 또는 '장애접수'테이블과 NL 아우터 조인하여 10건을 추출하도록 한다.

🔥 놓친 부분

  • 조인 조건이 하나라도 불완전하면 아예 조회를 하지 않으므로 반드시 개통접수 테이블과 장애접수 테이블에 조인을 할 때 아우터 조인을 시도한다!!!!!!
    • 조인할 때 개통접수번호(장애접수번호)가 NULL이면 NL조인도 그냥 안되는거다.이 때 둘 중 하나가 안되면 다른 하나는 조인이 되어야 하기 때문에 아우터 조인으로 처리해야 하는 것이다.

😥 헷갈렸던 부분

  • NVL2("값", "지정값1", "지정값2")
    • NVL2 함수는 NULL이 아닌 경우 지정값1을 출력하고, NULL인 경우 지정값2를 출력한다.
  • 아우터조인 대상 테이블은 누가 되어야 하는가 ?
    • 조인이 되지 않아도 널값으로 표기되어야 하는 테이블은 개통접수 테이블과 장애접수 테이블이다.
      • 근데 나는 거꾸로 썼다..작업 지시 테이블이 아우터 조인 대상이 되게...바보 ㅠ 그러면 만약에 조인되지 않았다면 아우터조인을 하나마나 결과 출력이 안됐을거자나 !! ㅠ_ㅠ!!
profile
도광양회(韜光養晦) ‘빛을 감추고 어둠속에서 힘을 기른다’

0개의 댓글