코딩테스트/MySQL

[프로그래머스 Level 2] 연도별 대장균 크기의 편차 구하기(MySQL) .Feat 스칼라 서브쿼리 성능 개선

최-코드 2024. 6. 26. 19:55

코딩테스트 연습 - 연도별 대장균 크기의 편차 구하기  | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

스칼라 서브쿼리는 메인 쿼리가 실행되고 한 행에 대해 스칼라 서브쿼리가 실행되기 때문에, 메인 쿼리에서 조회하는 행이 많으면 성능이 현저히 떨어지게 된다.

 

SELECT YEAR(D.DIFFERENTIATION_DATE) AS YEAR, (SELECT MAX(E.SIZE_OF_COLONY) FROM ECOLI_DATA AS E WHERE YEAR(E.DIFFERENTIATION_DATE) = YEAR(D.DIFFERENTIATION_DATE))-D.SIZE_OF_COLONY AS YEAR_DEV, D.ID
FROM ECOLI_DATA AS D
ORDER BY YEAR, YEAR_DEV

 

따라서 LEFT OUTER JOIN에 인라인 뷰를 통해 성능 저하를 해결할 수 있다.

이는 서브쿼리를 한 번만 실행시키는 효과가 있기 때문이다.

 

SELECT YEAR(D.DIFFERENTIATION_DATE) AS YEAR, F.MV-D.SIZE_OF_COLONY AS YEAR_DEV, D.ID
FROM ECOLI_DATA AS D LEFT OUTER JOIN (
    SELECT YEAR(E.DIFFERENTIATION_DATE) AS YEAR, MAX(E.SIZE_OF_COLONY) AS MV 
    FROM ECOLI_DATA AS E 
    GROUP BY YEAR(E.DIFFERENTIATION_DATE)
    ) AS F
    ON YEAR(D.DIFFERENTIATION_DATE) = F.YEAR
ORDER BY YEAR, YEAR_DEV