해결된 질문
작성
·
82
답변 2
1
박서현님 안녕하세요.
작성해주신 쿼리는 trainer_pokemon 데이터에서 필터링을 해주지 않고 전체 데이터에서 JOIN을 수행하게 됩니다. 그렇기 때문에 쿼리의 연산이 더 걸리게 됩니다. 다만 지금 데이터는 매우 작기 때문에 연산이 더 걸린다를 체감하지 못할거에요.
JOIN을 할 때는 필요한 데이터만 먼저 작게 만들고, 그 후에 작게 만든 것들끼리 JOIN해야 연산이 빠르게 됩니다. 지금 쿼리에서는 문제가 없어도, 이런 맥락을 인지하셔야 쿼리 최적화라는 것을 실행하게 되어요.
제가 작성했었던 쿼리에서
SELECT
generation,
COUNT(tp.id) AS pokemon_cnt
FROM (
SELECT
id,
trainer_id,
pokemon_id,
status
FROM basic.trainer_pokemon
WHERE
status IN ("Active", "Training")
) AS tp
LEFT JOIN basic.trainer AS t
ON tp.trainer_id = t.id
LEFT JOIN basic.pokemon AS p
ON tp.pokemon_id = p.id
WHERE
t.hometown = "Incheon"
GROUP BY
generation
이렇게 답을 드렸는데, 엄밀히 말하면 t.hometown의 Incheon 조건도 서브쿼리로 만들어서 하는게 연산 수행에 더 적습니다.
JOIN을 할 때 Row 수 관점으로 생각해보세요.
지금 작성하신 trainer_pokemon x trainer x pokemon
row 수 만큼(물론 어떤 JOIN이냐에 따라 조금 다르지만) 계산한다고 생각하시면 이해하기 편할거에요. row를 줄였다면 위 식에서 trainer_pokemon이 줄어들었기 때문에 연산이 더 빠르겠지요.
쿼리 퍼포먼스 관점에서 줄이는 것이 좋고, 데이터를 탐색하는 관점에서도 필터링을 하는 것이 더 좋습니다. 데이터가 많아지면 체감이 될 수 있으므로(물론 빅쿼리는 연산 파워가 좋은 편이라 크게 체감은 안될수도 있어요. 데이터가 엄청 많아질 때 이슈) 지금부터 JOIN 할 때는 줄여가며 해보시는 것을 추천드려요.
약간은 다른 맥락이지만, 저번에 올라온 질문 답변을 보시는 것도 추천드려요. 실행 세부 정보를 보여드리면서 알려드렸던 질문이 있어요.
0