스칼라 서브쿼리란?
스칼라 서브쿼리는 우리가 흔히 SELECT안에 SELECT라 부르는 SELECT 절의 서브쿼리를 말합니다.
스칼라 서브쿼리를 작성을 하면 LEFT OUTER JOIN과 같은 결과 값을 얻을 수 있는데요, 하지만 JOIN을 사용하는 것보다 성능이 좋습니다.
성능에 대해서 이야기를 조금 더 해보자면 스칼라 서브쿼리가 무조건 JOIN보다 성능이 좋다? 이것은 아닙니다. 스칼라 서브쿼리와 JOIN을 각각 필요한 곳에 작성을 하는 게 제일 중요합니다.
다음과 같은 표를 만드는 SQL을 만들어봅시다.
TABLE-A : id(A_id), title, description, price, pub_date, category_id(B_id)
TABLE-B : B_id, category
TABLE-C : A_id, likes
title | description | price | pub_date | category | likes |
---|
스칼라 서브쿼리를 이용한 SQL
SELECT title, description, price, pub_date,
(SELECT category FROM B WHERE B_id = category_id) AS category,
(SELECT count(*) FROM C GROUP BY A_id) AS likes
FROM A
JOIN을 이용한 SQL
SELECT title, description, price, pub_date, category, likes
FROM A AS a
LEFT JOIN (SELECT category FROM B WHERE b.B_id = a.category_id) AS b
ON a.category_id = b.B_id
LEFT JOIN (SELECT count(*) as likes FROM C GROUP BY A_id) AS c
ON a.id = c.A_id
위 테이블을 만드는데 두 가지 SQL문을 작성할 수 있습니다. 그럼 어떤 상황에서 어떤 SQL문을 사용하는 게 좋을까요? 이는 서브쿼리의 동작 방식을 알면 어떤 SQL문을 사용하는 게 좋은지 알 수 있습니다.
스칼라 서브쿼리 동작 방식
스칼라 서브쿼리는 메인쿼리 동작 후에 서브쿼리가 동작을 합니다. 즉 메인쿼리 하나에 서브쿼리 3개가 있다면 메인쿼리 하나가 동작을 하면 서브쿼리가 3개가 동작을 하는 것입니다. 이때 조회 데이터 수가 적으면 크게 문제가 발생하지 않습니다. 하지만 데이터 수가 100개라면 어떨까요? 100개의 데이터가 존재한다면 메인쿼리 한번 동작 후에 서브쿼리가 300번이 동작하게 되고 결국에는 쿼리가 301회 동작하게 되는 것입니다. 이 데이터가 100개 1000개 10000개 등 점점 읽는 데이터 양이 많아지면 당연히 성능이 저하될 수밖에 없습니다.
스칼라 서브쿼리는 언제 사용 하나요?
스칼라 서브쿼리는 처리할 데이터 양이 많으면 많을수록 성능이 떨어지기 때문에 데이터 하나를 불러오는 상세조회 같은 경우에는 사용하는 게 오히려 더 좋습니다. 하지만 전체 데이터 리스트를 불러오는 목록에서는 스칼라 서브쿼리는 사용하면 성능이 오히려 떨어지니 이점을 유의하여 쿼리문을 작성하시면 될 것 같습니다.
⭐요약⭐
데이터가 많다 : JOIN 사용, 스칼라 서브쿼리 지양
처리 데이터가 적다 : 스칼라 서브쿼리 사용
'데이터베이스' 카테고리의 다른 글
UPSERT로 INSERT와 UPDATE 한번에 하기 (0) | 2024.01.15 |
---|---|
MySQL 데이터 삭제 (0) | 2024.01.13 |
[SQL] timezone 수정하기 (0) | 2023.12.20 |
DATABASE의 제약조건 (NOT NULL과 DEFAULT) (0) | 2023.12.19 |
[SQL] 날짜/시간 타입 (0) | 2023.12.19 |