programmers.co.kr/learn/courses/30/lessons/77487
총 3가지 방식으로 풀어 보았습니다.
1. 집계함수 COUNT + PARTITION BY
실행계획을 보면 메인 쿼리와 서브 쿼리 둘다 인덱스를 타지 않고 풀스캔을 하고 둘다에서 filesort가 발생한다.
3가지 방법 중 성능이 가장 별로일거라고 생각이 든다.
SELECT PL.ID, PL.NAME, PL.HOST_ID
FROM
(
SELECT * , COUNT(*) OVER (PARTITION BY HOST_ID) AS HOST_COUNT
FROM PLACES
) PL
WHERE PL.HOST_COUNT > 1
ORDER BY PL.ID;
2. GROUP BY + IN절
메인 쿼리는 INDEX 스캔을 사용하고 filesort또한 발생하지 않는다.
IN절은 존재하는 값을 전부 확인한다는 점에서 아래에서 사용한 EXISTS보다 성능이 낮을 것으로 생각이 된다.
SELECT *
FROM PLACES PL1
WHERE PL1.HOST_ID IN (
SELECT HOST_ID
FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(*) > 1
)
ORDER BY ID;
3. GROUP BY + EXISTS
IN절을 사용했을 때와 다른점은 서브쿼리의 WHERE에 의한 차이이며
EXISTS는 해당 값의 존재 여부만 체크하므로 3가지 중 가장 좋은 성능을 보일 것으로 생각이 된다.
SELECT *
FROM PLACES PL1
WHERE EXISTS (
SELECT 1
FROM PLACES PL2
WHERE PL1.HOST_ID = PL2.HOST_ID
GROUP BY HOST_ID
HAVING COUNT(*) > 1
)
ORDER BY ID;
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 로또의 최고 순위와 최저 순위 문제 (자바) (0) | 2021.04.27 |
---|---|
프로그래머스 - 행렬 테두리 회전하기 문제 (자바) (0) | 2021.04.27 |
프로그래머스 - 점프와 순간 이동 문제 (자바) (0) | 2021.04.24 |
프로그래머스 - 스티커 모으기(2) 문제 (자바) (0) | 2021.04.23 |
프로그래머스 - 모두 0으로 만들기 (자바) (0) | 2021.04.23 |