ch0nny_log

[빅데이터분석] SQL 튜닝_TIL 27 본문

빅데이터 분석(with 아이티윌)/SQL

[빅데이터분석] SQL 튜닝_TIL 27

chonny 2024. 6. 20. 16:36

[TIL 27] 240620


30. 3개 조인할때 조인방법

실행계 NL조인 HASH 조인 SORT MERGE 조인
위쪽테이블 driving table hash table 선행 테이블
아래쪽 테이블 drivent table probe table 후행 테이블

 

■ 3개의 테이블을 조인을 한다고 하면 

        emp  ------------>   dept  ------------>  salgrade  
                     ↑                       ↑
                hash join                nl  join

 

 select  /*+  leading(e,d,s)  use_hash(d)  use_nl(s)  */   e.ename, d.loc, s.grade
    from   emp   e,  dept   d,  salgrade   s
    where  e.deptno  = d.deptno  
      and   e.sal  between  s.losal   and  s.hisal;
      
      select * from  table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));

 

문제1. 위의 sql이 아래와 같이 조인순서와 조인방법이 결정되게끔 힌트를 주시오.
    salgrade  ------------>   emp  ------------>  dept
                                ↑                       ↑
              sort merge join          nested loop  join
 select  /*+  leading(s,e,d)  use_merge(e)  use_nl(d)  */   e.ename, d.loc, s.grade
    from   emp   e,  dept   d,  salgrade   s
    where  e.deptno  = d.deptno  
      and   e.sal  between  s.losal   and  s.hisal;
      
      select * from  table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));



 

문제2.   위의 SQL에서 부서위치가 DALLAS  의 데이터만 출력하시오
select    e.ename, d.loc, s.grade
    from   emp   e,  dept   d,  salgrade   s   -- 14 / 4  /5 건
    where  e.deptno  = d.deptno  
      and   e.sal  between  s.losal   and  s.hisal
      and   d.loc='DALLAS';  --1건

 dept  ------------>   emp  ------------> salgrade 
                    ↑                       ↑             
  sort merge join          nested loop  join


                         1건         5건
 조인순서:   dept ----> emp ---> salgrade
                        ↑            ↑
조인방법:       nl 조인          nl 조인

그런데 만약에 다음과 같은 상황이면 ?

                         1건         5만건
 조인순서:   dept ----> emp ---> salgrade
                        ↑            ↑
조인방법:       nl 조인      merge  조인

만약에 방금 위와 같이 dept 와 emp 를 조인했을때 5만건이 결과 데이터로 
생성되었다라고 가정하고 아래의 SQL의 힌트를 주시오 !

 select  /*+ leading(d,e,s)  use_nl(e)  use_merge(s)  */  e.ename, d.loc, s.grade
    from   emp   e,  dept   d,  salgrade   s   
     where  e.deptno  = d.deptno  
      and   e.sal  between  s.losal   and  s.hisal
      and   d.loc='DALLAS';
문제 3. 아래의 SQL의 조인순서와 조인 방법을 결정하는데 다음과 같은 상황이라고 가정하고 조인순서와 조인방법을 결정하시오.
    salgrade  ------------>   emp  ------------>  dept
                       (10만건)             (12건)
        

  select  /*+ leading(s, e, d)  use_merge(e)  use_nl(d)  */  e.ename, d.loc, s.grade
    from   emp   e,  dept   d,  salgrade   s   
     where  e.deptno  = d.deptno  
      and   e.sal  between  s.losal   and  s.hisal;  
           
      select * from  table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));