[SQLP실기풀이]4장 조인튜닝(3)-스칼라서브쿼리 43번

Yu River·2022년 7월 30일
0

SQLP실기연습

목록 보기
17/44

문제 링크 : https://velog.io/@yooha9621/SQLP실기문제-4장-조인튜닝-스칼라서브쿼리43번

[내 답안-push_pred 활용]

  • 고객 테이블에서 부분 범위 처리 해서 한번 감싸고 그 결과값을 나중에 고객 테이블과 조인하려고 했다.
  • 근데.. 틀린건가? 부분 범위 처리 해야된대서 한번 감쌌는데...
select /*+ leading(T1) USE_NL(T2)*/ T1.* 
from (
  select c.고객번호, c.고객명
  from 고객 c
  where c. 가입일시 >= trunc(add_months(sysdate, -1), 'mm')
) T1,(/*+ NO_MERGE PUSH_PRED */select 고객번호
      ,avg(거래금액) 평균거래
      ,min(거래금액) 최소거래
      ,max(거래금액) 최대거래
      from 거래
      where 거래일시 >= trunc(sysdate, 'm㎜')
      group by 고객번호) T2
where T1.고객번호 = T2.고객번호;

[답안-push_pred 활용]

  • 답안은 아래와 같이 나와있었다.
select /*+ ORDERED USE_NL(T1) */ c.고객번호, c.고객명
	from 고객 c,(select /*+ NO_MERGE PUSH_PRED */ 고객번호
      ,avg(거래금액) 평균거래
      ,min(거래금액) 최소거래
      ,max(거래금액) 최대거래
      from 거래
      where 거래일시 >= trunc(sysdate, 'm㎜')
      group by 고객번호) T1
where c.가입일시 >= trunc(add_months(sysdate, -1), 'mm')
where T1.고객번호 = T2.고객번호;

또는

select /*+ ORDERED USE_NL(T1) NO_MERGE(T1) PUSH_PRED(T1) */ c.고객번호, c.고객명
	from 고객 c,(select 고객번호
      ,avg(거래금액) 평균거래
      ,min(거래금액) 최소거래
      ,max(거래금액) 최대거래
      from 거래
      where 거래일시 >= trunc(sysdate, 'm㎜')
      group by 고객번호) T1
where c.가입일시 >= trunc(add_months(sysdate, -1), 'mm')
where T1.고객번호 = T2.고객번호;

그러면 이 상황에서 부분범위처리가 들어가면 쿼리는 어떻게 변하는거지..? 🤔

select * from (
  select c.고객번호, c.고객명
      from 고객 c,(select /*+ NO_MERGE PUSH_PRED */ 고객번호
        ,avg(거래금액) 평균거래
        ,min(거래금액) 최소거래
        ,max(거래금액) 최대거래
        from 거래
        where 거래일시 >= trunc(sysdate, 'm㎜')
        group by 고객번호) T1
  where c.가입일시 >= trunc(add_months(sysdate, -1), 'mm')
  where T1.고객번호 = T2.고객번호
) where rownum <= 10;
  • 이렇게 되나?? 비슷한 문제가 저번 SQLP에 나왔는데 나는 내 답안같이 한번 감싸서 명시적으로 '부분범위 처리 후'에 조인하도록 기술하였다.근데 그렇게 써서 내가 점수를 반만 받았던건가!!??
  • 아래가 답이라면 .. 고객 테이블과 거래 테이블 조인 작업을 한 블록 안에다가 넣고 힌트 명시하고 밖에다가 부분 범위 처리를 하면 되는건가 ?
profile
도광양회(韜光養晦) ‘빛을 감추고 어둠속에서 힘을 기른다’

0개의 댓글