본문 바로가기
코딩 테스트/sql

[SQL] 대장균들의 자식의 수 구하기 풀이

by so5663 2024. 11. 2.

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)를 사용하면 인덱스를 효과적으로 활용하여 검색 성능을 개선할 수 있습니다.