다음의 쿼리는 직원번호가 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
'DB > SQL' 카테고리의 다른 글
MySQL 튜닝 : 대량 데이터 수정/삽입 시 인덱스 제거 (0) | 2021.10.11 |
---|---|
MySQL 튜닝 : 적합한 인덱스 생성하기 (0) | 2021.10.11 |
MySQL 조인 JOIN 튜닝 : 불필요한 조인을 EXISTS로 바꾸기 (0) | 2021.10.10 |
MySQL 쿼리 정리 (0) | 2021.10.10 |
MYSQL SELECT 튜닝 (0) | 2021.10.10 |