DB/SQL

MySQL 튜닝 : 인라인 뷰 데이터 줄이기

호두밥 2021. 10. 10. 19:55

다음의 쿼리는 직원번호가 10000이상 20000사이인 직원의 최대, 최소, 평균 봉급을 가져오는 쿼리문입니다.

 인라인 뷰 SS는 모든 직원의 최소, 최대, 평균 봉급을 구한 값을 저장한 임시 테이블입니다.

그리고 임시테이블과 EMPLOYEES 테이블을 조인하면서 직원번호가 10000이상 20000사이인 직원을 골라내고 있습니다.

SELECT E.EMP_NO, SS.MAX_SAL, SS.MIN_SAL, SS.AVG_SAL 
FROM EMPLOYEES E, 
	( SELECT S.EMP_NO, 
    	MAX(S.SALARY) AS MAX_SAL,
        MIN(S.SALARY) AS MIN_SAL,
        AVG(S.SALARY) AS AVG_SAL 
     FROM salaries S 
     GROUP BY S.EMP_NO) SS    
WHERE E.EMP_NO = SS.EMP_NO
	AND E.EMP_NO BETWEEN 10000 AND 20000;

수행시간 : 2.406 SEC / 0.000 SEC

비용 : 350722.560192

 

 

다음은 외부의 직원번호 검색 조건을 인라인 뷰 안에 넣어 인라인뷰의 데이터 크기를 줄여준 쿼리입니다.

SELECT E.EMP_NO, SS.MAX_SAL, SS.MIN_SAL, SS.AVG_SAL 
FROM EMPLOYEES E, 
	( SELECT S.EMP_NO, MAX(S.SALARY) AS MAX_SAL, MIN(S.SALARY) AS MIN_SAL, AVG(S.SALARY) AS AVG_SAL FROM salaries S
    WHERE S.EMP_NO BETWEEN 10000 AND 20000
    GROUP BY S.EMP_NO) SS    
WHERE E.EMP_NO = SS.EMP_NO;

 

수행시간 : 0.125 SEC / 0.000 SEC

비용 : 257034.023276

 

 

위 쿼리의 인라인 뷰와 EMPLOYEES 테이블의 조인 과정에서 FULL SCAN이 일어납니다. 인라인 뷰의 데이터건수는 10000건으로 여기서 많은 비용을 소모하게 됩니다.

 

반면 스칼라 서브쿼리를 사용한 다음의 쿼리는 테이블에 3번 접근하지만 EMP_NO를 이용해 인덱스로 바로 접근하며, FULL SCAN 과정이 없어서 더 효율적입니다.

SELECT E.EMP_NO, 
	 (SELECT MAX(SALARY) FROM SALARIES S WHERE S.EMP_NO = E.EMP_NO) AS MAX_SAL,
	 (SELECT MIN(SALARY) FROM SALARIES S WHERE S.EMP_NO = E.EMP_NO) AS MIN_SAL,
	 (SELECT AVG(SALARY) FROM SALARIES S WHERE S.EMP_NO = E.EMP_NO) AS AVG_SAL
FROM EMPLOYEES E 
WHERE E.EMP_NO BETWEEN 10000 AND 20000;

수행시간 : 0.250 SEC / 0.016 SEC

비용 : 109976.603553