(1) 현황분석
explain select 사원.사원번호,
급여.평균연봉,
급여.최고연봉,
급여.최저연봉
from 사원,
(select 사원번호,
round(avg(연봉), 0) 평균연봉,
round(max(연봉), 0) 최고연봉,
round(min(연봉), 0) 최저연봉
from 급여
group by 사원번호
) 급여
where 사원.사원번호 = 급여.사원번호
and 사원.사원번호 between 10001 and 10100;
(2) 문제점
(3) 튜닝 수행
explain select 사원.사원번호,
(select round(avg(연봉), 0)
from 급여 as 급여1
where 사원번호 = 사원.사원번호
) as 평균연봉,
(select round(max(연봉), 0)
from 급여 as 급여2
where 사원번호 = 사원.사원번호
) as 최고연봉,
(select round(min(연봉), 0)
from 급여 as 급여2
where 사원번호 = 사원.사원번호
) as 최저연봉
from 사원
where 사원.사원번호 between 10001 and 10100;
(1) 현황분석
explain select 사원.사원번호, 사원.이름, 사원.성, 사원.입사일자
from 사원
inner join 급여 on 사원.사원번호 = 급여.사원번호
where 사원.사원번호 between 10001 and 50000
group by 사원.사원번호
order by sum(급여.연봉) desc
limit 150, 10;
(2) 문제점
(3) 튜닝 수행
explain select 사원.사원번호, 사원.이름, 사원.성, 사원.입사일자
from (select 사원번호
from 급여
where 사원번호 between 10001 and 50000
group by 사원번호
order by sum(급여.연봉) desc
limit 150, 10) 급여,
사원
where 사원.사원번호 = 급여.사원번호;
(1) 현황분석
explain select count(사원번호) as 카운트
from(
select 사원.사원번호, 관리자.부서번호
from (select *
from 사원
where 사원번호 > 300000
) 사원
left join 부서관리자 관리자
on 사원.사원번호 = 관리자.사원번호
) 서브쿼리;
(2) 문제점
(3) 튜닝 수행
explain select count(사원번호) as 카운트
from 사원
where 성별 = 'M'
and 사원번호 > 300000;
(1) 현황분석
explain select distinct 매핑.부서번호
from 부서관리자 관리자,
부서사원_매핑 매핑
where 관리자.부서번호 = 매핑.부서번호
order by 매핑.부서번호;
(2) 문제점
SELECT 절에 매핑.부서번호를 관리자.부서번호로 작성해도 동일한 겨로가 출력
-> 부서번호가 같은지 확인하는 과정에 대한 고민 필요
from절과 where 절로 조인 수행 뒤 그 조인 결과에 대해 DISTINCT 작업을 수행하는데 조인 전 미리 중복 제거 고려
(3) 튜닝 수행
explain select 매핑.부서번호
from ( select distinct 부서번호
from 부서사원_매핑 매핑
) 매핑
where exists(select 1
from 부서관리자 관리자
where 부서번호 = 매핑.부서번호)
order by 매핑.부서번호;
부서사원_매핑 테이블의 데이터 가져올 때 부서번호 데이터릴 미리 중복 제거
부서관리자 테이블의 데이터를 모두 확인하지 않고 동일한 부서번호가 있다면 이후의 데이터에는 더 접근하지 않는 EXISTS 연산자 활용
id 2 행은 인라인 뷰로 Using index for group-by : DISTINCT 작업을 수행하고자 I_부서번호 인덱스로 정렬한 뒤에 중복을 제거
id 1 행은 전체 24개의 행을 인덱스 풀 스캔 후 중복 제거된 부서사원_매핑 테이블과 조인, 이때 부서관리자 테이블에 exists 연산자로 비교할 부서번호가 있다면 이후로 동일한 부서번호 데이터는 확인하지 않고 건너뛰므로 Extra 항목에 LooseScan으로 표시
참고: 업무에 바로쓰는 SQL 튜닝 / 양바른 저