[LeetCode] 570. Managers with at Least 5 Direct Reports

단간단간·2024년 5월 2일
0

SQL 문제

목록 보기
12/12

문제 링크:

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
		)
profile
simple is best

1개의 댓글

comment-user-thumbnail
2024년 5월 2일

안녕하세요, 99클럽 그룹 리더 은딩입니다!

Exists가 값이 있는지 없는지만 반환해서 IN보다 빨라 효율적인지 알았는데 꼭 그런건 아니군요!! 감사합니다~

앞으로도 힘내서 매일 TIL 도전해 보세요! 화이팅입니다 :)

99클럽 https://bit.ly/3TN5TBL

답글 달기