Leet Code SQL : 1148. Article Views 1
https://leetcode.com/problems/article-views-i/description/
LeetCode - The World's Leading Online Programming Learning Platform
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
SELECT DISTINCT author_id AS id
FROM Views
WHERE author_id = viewer_id
ORDER BY id
단순히 문제를 읽고 쿼리를 날리면 바로 위 쿼리처럼 빠르게 작성할 수 있을 것이다. 하지만 그 결과는 꽤나 충격적이었다. 상위 95%라니.. ㅎㅎㅎ 조금 더 빠른 Runtime을 기록한 쿼리를 살펴보니 DISTINCT 키워드 없이 GROUP BY를 사용한 경우가 있었다.
EXPLAIN [SELECT Query] 로 실행 정보 살펴보기
EXPLAIN SELECT DISTINCT author_id AS id
FROM Views
WHERE author_id = viewer_id
ORDER BY id
GROUP BY의 재발견
GROUP BY를 사용하는 경우를 주로 집계값을 계산하기 위한 경우로 한정해서 생각하고 있었는데, 집계값을 사용하지 않는 GROUP BY의 경우에는 그 자체로 중복을 제거하는 기능을 동일하게 수행한다.
SELECT author_id AS id
FROM Views
WHERE author_id = viewer_id
GROUP BY id
ORDER BY id
이와 관련해서 추가적으로 검색해서 찾아보았다.
https://stackoverflow.com/questions/581521/whats-faster-select-distinct-or-group-by-in-mysql
What's faster, SELECT DISTINCT or GROUP BY in MySQL?
If I have a table CREATE TABLE users ( id int(10) unsigned NOT NULL auto_increment, name varchar(255) NOT NULL, profession varchar(255) NOT NULL, employer varchar(255) NOT NULL, PRIMARY ...
stackoverflow.com
DISTINCT의 경우는 결과를 정렬할 필요가 없고,
GROUP BY의 경우는 기본적으로 DESC 순서로 정렬을 한다고 한다. (그렇군!)
때문에 중복을 제거하는 부분 이외에 추가적인 정렬을 하는 GROUP BY를 중복 제거에 사용할 경우에 데이터가 많은 경우에 성능을 악화시킬 수 있다고 한다. 즉, 위 경우에는 Row가 7개밖에 없는 적은 데이터이기 때문에 GROUP BY의 성능이 더 좋은 것으로 나타난 것일 수 있다.
행 개수가 많은 데이터에서 테스트해보기
이전에 다른 글에서 다루었던 Kaggle에 있는 데이터셋을 기준으로 실제 실행 결과와 실행 시간에 대한 로그를 살펴보고자 한다.
[RFM] MySQL Workbench에 csv 파일 불러오기
Dataset : Netflix Watch Log ( from kaggle ) https://www.kaggle.com/datasets/arjunajn/netflix-watch-log Netflix Watch Log Netflix user data which is used to personalize every customer's suggetions. www.kaggle.com Licence : CC BY-NC-SA 4.0 Usability : 10.0
bakeproduct.tistory.com
이 중 all_clickstream 테이블에 있는 `Profile Name` 정보에 있는 중복을 제거하려고 한다.
Duration으로 비교를 했을 때 DISTINCT가 확실히 더 빠르다는 것을 실험적으로 확인할 수 있었다.
때문에 test case가 적은 환경에서 중복을 제거하는 경우에는 두 쿼리 성능 상 큰 차이가 없을 수 있지만 대규모 데이터를 처리할 시에는 DISTINCT를 정석적으로 사용하는 것이 더 효율적인 쿼리를 작성하는 방법이라고 할 수 있을 것이다.
'SQL' 카테고리의 다른 글
[JOIN] LEFT JOIN 효과적으로 사용하기 (0) | 2024.02.18 |
---|---|
[HackerRankSQL] Symmetric Pairs (0) | 2024.02.02 |
[HackerRank SQL] The Report 문제풀이 (2) | 2024.01.29 |
[HackerRank SQL] Top Earners (0) | 2024.01.21 |