584. Find Customer Referee

최지웅·2025년 2월 23일
0

LeetCode

목록 보기
18/27

(25.02.23)

문제이해

  • id가 pk이고 referee_id가 2가 아닌 고객의 이름들을 순서없이 찾아라.

문제접근

  • 최초로 접근한 방법은 아래와 같다.
SELECT name FROM Customer WHERE referee_id!=2 OR referee_id is NULL;


하지만 성능이 마음에 들지 않는다.

최적화 시도

1. WHERE 내부 OR 순서 바꾸기

예시를 참고해보았을 때 referee_id가 NULL인 값이 많았다. 순서를 변경한 뒤 성능을 측정해보자.

SELECT name FROM Customer WHERE referee_id is NULL OR referee_id!=2;


소폭 성능이 향상됐음을 알 수 있다.

2. not in을 사용하여 referee_id가 2인 항목을 제외하기

SELECT name FROM Customer WHERE id not in (SELECT id FROM Customer WHERE referee_id=2);


성능이 오히려 안좋아짐을 알 수 있었다. SQL은 간단할 수록 빠른 것 같다.

3. not in 을 사용하는 방법에서 distinct를 이용하기

SELECT name FROM Customer WHERE id not in (SELECT distinct id FROM Customer WHERE referee_id=2);

referee_id가 중복된 값이 많다고 판단하여 distinct로 not in 시의 연산을 최적화해보았다.

유의미한 성과가 있었다.

4. 조인을 이용하는 방법

referee_id가 2인 것과 원래의 테이블과 조인하여 추출하는 방법은 어떨까? 다만 조인이 기억이 잘 나지 않아 조금 공부를 해보자.

SELECT name FROM Customer a LEFT JOIN (SELECT * FROM Customer WHERE referee_id=2) b ON a.id!=b.id WHERE b.id IS NULL;

내가 바라는 것을 SQL로 옮기기 쉽지 않다.. 원하는 접근을 정리해보자.
조인을 이용하는 방법에는 두 개의 테이블이 사용된다. 테이블 1은 Customer그 자체, 테이블 2는 referee_id가 2인 Customer들이다 여기서 테이블2를 제외한 테이블2의 항목을 구하는 데에 조인을 사용하고 싶은 것이다. 이를 LEFT OUTER JOIN이라고 분류하는 듯 하다.

SELECT name FROM Customer a LEFT OUTER JOIN (SELECT * FROM Customer WHERE referee_id=2) b ON a.id!=b.id;

일단.. 위에 내가 작성한 코드를 좀 분석하며 공부하려했는데 이것저것 꼬여서..ㅎㅎ

5. 뛰어난 코드 참고

어느새 1시간이 넘어가서 최고의 성능을 기록한 코드를 찾아보았다.

그런데 띠용? 맨 처음 내가 접근했던 방법과 비교하여 차이점이 대문자 소문자 차이밖에 없었다. 그대로 복사해 나도 제출해보자.

ㅋㅋㅋㅋ 그냥 컴퓨터나 네트워크 차이인 듯 하다. 약간 뻘짓한 것 같기도 하지만 distinct나 not in이나 join(은 공부가 더 필요하지만)에 대한 생각들과 성능비교를 통해 조금이나마 얻어가는게 있는 경험이었다. 우선 git commit은 내 기준에서 489ms로 최고의 성능을 보여준 3번 최적화 코드를 사용해야겠다.

profile
이제 3학년..

0개의 댓글

관련 채용 정보