7.2 SubQuery를 이용한 튜닝
※ 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) |