inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

초보자를 위한 BigQuery(SQL) 입문

5-6. JOIN 연습 문제 3~5번

JOIN 5번 문제 질문 있습니다!

해결된 질문

165

박서현

작성한 질문수 3

0

안녕하세요, 카일님! 수업 잘 듣고 있습니다!

문제 해설 보기 전 혼자 풀었을 때, 저는 아래와 같이 쿼리를 작성했어요. 서브쿼리 안에 필요한 컬럼만 넣고 보면서 쓰는 게 편하더라고요. 제 쿼리로 쓰면 데이터를 더 많이 처리하게 되는 건지 궁금해서 질문합니다!

image.png

 

 

sql bigquery 데이터-리터러시

답변 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 할 때는 줄여가며 해보시는 것을 추천드려요.

 

약간은 다른 맥락이지만, 저번에 올라온 질문 답변을 보시는 것도 추천드려요. 실행 세부 정보를 보여드리면서 알려드렸던 질문이 있어요.

https://www.inflearn.com/community/questions/1342790/5-6-2%EB%B2%88-%EC%97%B0%EC%8A%B5%EB%AC%B8%EC%A0%9C-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4

0

박서현

아, 실행 세부정보를 보면 어떤 게 더 최적화된 쿼리인지 알 수 있군요! 감사합니다👍🏻

vs code

0

51

2

수업자료 다운

0

49

2

쿼리 화면 문의

0

72

2

4-5. 3번 문제 질

0

66

2

JOIN 1번 문제

1

76

2

battle 테이블 생성 시 생성 오류

0

69

1

5-6. 4번 문제 WHERE 조건의 위치 문의

0

65

2

5-6. 연습문제 4번, type2에 대해서는 고려하지 않아도 될까요?

1

72

2

battle table 오류

0

69

2

location IS NOT NULL 을 굳이 안 써도 되지 않나요?

0

62

2

12강 집계 함수

0

49

1

2-6. 연습 문제 1~3번

0

50

1

안녕하세요! 11번 문제 query문에 관해 질문드립니다

0

51

1

2-6 #2 WHERE vs. HAVING절 사용 여부 차이

0

67

1

섹션 별 퀴즈

0

67

1

espanso 설치 완료 후 프로그램 실행 문제

0

104

2

Syntax에러

0

83

2

4-5. 1번 문제 TIMESTAMP 관련 질문

0

89

2

시각화 도구 사용

0

110

2

11번 문제 GROUP BY 사용하는 이유

0

99

1

big query 쿼리 결과 컬럼 폭

0

108

3

battle 스키마 조건 복사 파일이 열리지 않아요.

0

130

1

6-5 데이터 검증 결과 예시문제

0

79

2

battle 스키마 조건 복사붙여넣기용 자료

0

115

2