https://school.programmers.co.kr/learn/courses/30/lessons/293261
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
나의 풀이
with temp as (
select
fish_type
,(select fish_name from fish_name_info fni where fish_type = fi.fish_type) fish_name
,MAX(length) length
from fish_info fi
group by fish_type
)
select
id
,fish_name
,t.length
from temp t join fish_info fi
on t.fish_type = fi.fish_type
and t.length = fi.length
order by fi.id;
CTE를 사용하여 후에 id값을 조인 하였다.
개선된 쿼리
select
fi.id,
fni.fish_name,
fi.length
from fish_info fi
join fish_name_info fni
on fi.fish_type = fni.fish_type
join (
select
fish_type,
MAX(length) as max_length
from fish_info
group by fish_type
) max_lengths
on fi.fish_type = max_lengths.fish_type
and fi.length = max_lengths.max_length
order by fi.id;
- 서브쿼리 제거로 인한 최적화: 원래 쿼리에서 서브쿼리 (select fish_name from fish_name_info fni where fish_type = fi.fish_type)가 매번 실행되어야 했지만, JOIN 방식으로 변경하면 한 번의 조인으로 해결할 수 있습니다. 특히, fish_name_info의 크기가 클 경우 이러한 반복 조회는 성능에 큰 영향을 줄 수 있습니다.
- 조건부 집계의 단순화: MAX(ifnull(length, 10))에서 ifnull을 사용해 기본값을 설정하는 부분이 없어지면서, 집계 연산이 단순화되었습니다. 집계에서 조건문이 없어질수록 최적화가 유리해집니다.
- JOIN을 통한 인덱스 활용 증가: fish_type과 length에 인덱스가 설정된 경우, 조인과 집계 연산이 더 빠르게 수행될 수 있습니다. 특히, 최대 길이를 구하는 부분에서 MAX(length)를 사용하면 인덱스를 효과적으로 활용하여 검색 성능을 개선할 수 있습니다.
'코딩 테스트 > sql' 카테고리의 다른 글
[SQL] 대장균들의 자식의 수 구하기 풀이 (0) | 2024.11.02 |
---|---|
[SQL] 대장균의 크기에 따라 분류하기 2 풀이 (0) | 2024.10.31 |