Itwill 학습내용 정리/1. SQL

7.2 SubQuery를 이용한 튜닝

cannonvirus 2019. 4. 25. 21:32


※ EMP, DEPT, SALGRADE 테이블 구조

 


※ 튜닝

set autot traceonly statistics
 - 위의 쿼리는 시간이 얼마나 걸리는 지 알게 해준다.

1. select ~ scalar subquery 튜닝

 # 문제 116. 다음을 튜닝하시오.

 

 # 튜닝 전

select ename, sal, (select sum(sal) from emp) 총월급

  from emp;

 

 # 튜닝 후

select ename, sal, sum(sal) over () 총월급

  from emp;

 - 테이블을 많이 불러올수록 느려짐을 명심하자!!

 # 문제 117. 다음을 튜닝하시오.

 

 # 튜닝 전

select ename, sal, (select sum(sal) from emp) 총월급,

      (select max(sal) from emp) 최대월급,

      (select min(sal) from emp) 최소월급,

      (select round(avg(sal)) from emp) 평균월급

  from emp;

 

 # 튜닝 후

select ename, sal,

    sum(sal) over () 총월급,

    max(sal) over () 최대월급,

    min(sal) over () 최소월급,

    round(avg(sal) over ()) 평균월급

  from emp;

 # 문제 118. 다음을 튜닝하시오.

 

 # 튜닝 전

select deptno, ename, sal, (select sum(e2.sal) from emp e2 where e2.deptno = e1.deptno) 총월급

  from emp e1;

 

select e.deptno, e.ename, e.sal, e1.총월급

   from (select deptno, sum(sal) 총월급 from emp group by deptno) e1, emp e

   where e1.deptno = e.deptno;

 

 # 튜닝 후

select deptno, ename, sal, sum(sal) over (partition by deptno) 총월급

  from emp

 # 문제 119. 다음을 튜닝하시오. 

 

 # 튜닝 전

select empno, ename, sal, (select sum(sal) from emp b where b.empno <= e.empno) 누적치

  from emp e

  order by empno;

 

 # 튜닝 후

select empno, ename, sal, sum(sal) over (order by empno rows between unbounded preceding and current row) 누적치

  from emp;

 

2. from 절의 subquery 튜닝

 # 문제 120. 다음을 튜닝하시오. // 부서번호, 이름, 월급, 자기가 속한 부서번호의 평균월급을 출력하는데, 월급이 자기 부서의 평균 월급보다 큰 사원만 출력하시오.

 

 # 튜닝 전

select e1.deptno, e1.ename, e1.sal, e2.부서평균

  from (

    select deptno, round(avg(sal)) 부서평균

      from emp

      group by deptno

      ) e2, emp e1

  where e1.deptno = e2.deptno and e1.sal > e2.부서평균;

 

 # 튜닝 후

select *

  from(

    select deptno, ename, sal, round(avg(sal) over (partition by deptno)) 부서평균

      from emp

    )

  where sal > 부서평균

 - 튜닝 전은 조인을 사용하니 제일 최악이다. 튜닝 후는 일단 월하는 테이블을 from 절에 만든 다음에 원하는 것만 뽑아서 쓰는 경우이다.

 

3. having subquery 튜닝

 # 문제 121. 직업, 직업별 총월급을 출력하는데 직업이 SALESMAN의 총월급보다 더 큰 것만 출력하시오.

 

select job, sum(sal)
  from emp
  group by job
  having sum(sal) > (select sum(sal) from emp where job = 'SALESMAN');