문제 링크:
https://leetcode.com/problems/managers-with-at-least-5-direct-reports/description/?envType=study-plan-v2&envId=top-sql-50
회고 (문제를 풀면서 의식의 흐름):
- IN절로 비교할 때, 인덱스가 설정되어 있다면 비교가 빨라진다.
- 하지만 비교해야 하는 값이 많거나, 서브쿼리가 포함되어 있는 경우 성능이 저하될 수 있다.
- 아래 문제는 IN절을 사용할 때 서브쿼리가 포함되고, 데이터셋이 많아지면 비교 대상이 많아지기 때문에 성능이 저하될 것 같다고 생각했다. 이런 경우엔 EXISTS가 더 효율적이지 않을까?
- EXISTS 특징 정리
- EXISTS는 하위 쿼리가 적어도 하나 이상의 결과를 반환하는지 확인하는 데 사용된다. 주로 조건의 충족 여부만 중요할 때 사용한다.
- EXISTS는 하위 쿼리 결과의 양과 상관없이 최초의 일치에서 처리를 중단하기 때문에, 특히 하위 쿼리가 복잡하거나 많은 데이터를 스캔해야 하는 경우 더 효율적일 수 있다.
- EXISTS는 일반적으로 해당 조건과 관련된 데이터의 존재 유무만을 확인하기 때문에 IN보다 빠를 수 있다.
- 그래서 IN과 EXISTS 각각 사용해서 문제를 풀어봤는데, 예상과 달리 IN조건으로 푼 풀이가 6배는 빠르네..
- 서브쿼리로 나온 비교대상이 내 예상보다 많지 않았고, IN 조건에 걸린 컬럼이 PK라서 IN이 훨씬 빨랐던 것일까?
MySQL - IN() 활용 (runtime: 605ms)
SELECT T101.NAME
FROM Employee T101
WHERE T101.id IN (
SELECT DISTINCT (T102.managerId)
FROM Employee T102
GROUP BY T102.managerId
HAVING COUNT(T102.id) > 4
)
MySQL - EXISTS() 활용 (runtime: 3705ms)
SELECT T102.NAME
FROM Employee T102
WHERE EXISTS (
SELECT 1
FROM Employee T101
WHERE T102.id = T101.managerId
GROUP BY T101.managerId
HAVING COUNT(T101.id) >= 5
)
안녕하세요, 99클럽 그룹 리더 은딩입니다!
Exists가 값이 있는지 없는지만 반환해서 IN보다 빨라 효율적인지 알았는데 꼭 그런건 아니군요!! 감사합니다~
앞으로도 힘내서 매일 TIL 도전해 보세요! 화이팅입니다 :)
99클럽 https://bit.ly/3TN5TBL