Google BigQuery를 사용하면서 MYSQL과 같은 관계형 데이터베이스 시스템(RDBMS)을 사용했을때와 다르게 쿼리 작성등을 편하게 하다보니 무분별하게 사용하다 요금 폭탄을 맞거나 하는 경우가 있어 어떠한 방식으로 동작하는지 사용시에 발생하는 요금이 얼마나 되는지를 알아보는 시간을 갖도록 하겠습니다.
Google BigQuery의 동작 방식은 Google Cloud에서 제공하는 서버리스(Serverless) 데이터 웨어하우스 구조를 기반으로 하며, 대용량 데이터를 빠르게 분석할 수 있도록 설계되어 있습니다. 아래는 Google BigQuery의 쿼리 처리 방식 입니다.
1. 서버리스 아키텍처
- 사용자는 인프라(서버, 클러스터)를 직접 관리하지 않아도 됨
- Google이 자동으로 리소스를 확장 및 최적화
2. 쿼리 처리 전체 흐름
(1) SQL 입력
(2) Query Planner (실행 계획 수립)
(3) Stage → Step → Task 분할
(4) 노드(Node) + 슬롯(Slot) 병렬 처리
(5) 중간 결과 재조합
(6) 결과 반환
3. 쿼리 처리 구조
(1) SQL 쿼리 실행
(2) Query Planner (실행 계획 수립)
SQL을 실행 가능한 형태로 바꾸고, 성능을 최적화하는 실행 계획을 세우는 시스템
- SQL → 내부적으로 여러 단계(Scan, Join, Aggregate 등)로 나눔
- 각 단계에 작업 우선순위, 순서, 리소스 배분 등을 결정
- 내부적으로 DAG(Directed Acyclic Graph, 비순환 방향 그래프)로 실행 흐름 구성
쿼리 실행 단계 예시
SELECT user_id, COUNT(*)
FROMproject.dataset.events
WHERE event_date = '2025-07-06'
GROUP BY user_id
| 단계 | 설명 |
| 1. Scan | events 테이블에서 event_date = '2025-07-06' 파티션만 스캔 |
| 2. Filter | 날짜 조건에 맞는 데이터 필터링 |
| 3. Aggregate | user_id 기준으로 COUNT(*) 집계 |
| 4. Output | 결과 반환 |
각 단계는 Query Planner가 결정합니다. 이때 user_id가 클러스터링되어 있으면 → 더 빠르고 저렴한 실행 계획 생성
(3) STAGE, STEP, TASK 분할
| 단위 | 설명 |
| Stage | 쿼리의 상위 연산 단위 (Scan, Join, Aggregate 등) |
| Step | Stage 안의 하위 실행 단계 (연산 유형별 세분화) |
| Task | Step을 처리하는 가장 작은 작업 단위 (병렬 실행 가능) |
예: 하나의 쿼리는 3~10개의 Stage로 나뉘고, 각 Stage는 수천 개의 Task로 나뉠 수 있음.
(4) 내부 컴퓨팅 구조: 슬롯(Slot)과 노드(Node)
🧱 Slot
- BigQuery의 연산 리소스 단위 (CPU + RAM)
- Task 단위로 할당되어 병렬로 실행
- On-Demand에서는 Google이 자동으로 슬롯을 할당
- Flat-rate에서는 고정된 슬롯 수를 예약하여 사용
🖥️ Node
- 슬롯을 호스팅하는 컴퓨팅 서버 (GCP 내부의 물리/가상 머신)
- 각 노드는 여러 개의 슬롯을 가짐
- 노드는 지역/리전 단위로 분산되어 운영됨
(5) 분산 처리: 쿼리를 여러 서버에서 병렬로 분산 실행
(6) 실행 결과는 임시 저장 후 사용자에게 반환
4. 요금
Google BigQuery에서 쿼리를 사용하거나 실행할 때 발생하는 요금은 주로 “읽은 데이터 양(Scanned Data)” 기준으로 부과됩니다.
| 항목 | 설명 |
| 과금 기준 | 쿼리 실행 시 읽은 바이트 수 (스캔된 데이터) |
| 과금 단위 | $5 / TB (테라바이트 단위), 최소 10MB |
| 재사용 쿼리 | 쿼리 캐시가 작동하면 무료 |
| –dry_run | 예상 비용 확인 전용 실행 → 요금 없음 |
big_table이 3TB 규모이고, 파티션 설정이 안 되어 있다면
→ 전체 3TB 읽음 → $15 과금
반면에 event_time이 DATE 파티셔닝되어 있고,
해당 조건만 조회한다면
→ 300GB만 읽으면 → $1.5 과금
| 작업 유형 | 과금 기준 | 대략 요금 (USD) | 설명 및 특징 |
| Create | Batch Load: 무료 | 무료 | 파일 업로드 (CSV, JSON 등)는 비용 없음 |
| Streaming Insert: 행 단위 | 약 $0.01 / 200 행 | 실시간 데이터 삽입 시 발생 | |
| Read | 쿼리 스캔 바이트 기준 | 약 $5 / 1TB 스캔 데이터 | 읽은 데이터 양만큼 과금 |
| 쿼리 캐시 재사용 | 무료 | 24시간 내 동일 쿼리 시 캐시 결과 사용 | |
| Update | 업데이트 대상 데이터 스캔 | $5 / 1TB 스캔 데이터 (읽기 비용) + 저장 비용 발생 | 업데이트는 대상 데이터 전체 스캔 후 변경 부분 저장 |
| Delete | 삭제 대상 데이터 스캔 | $5 / 1TB 스캔 데이터 (읽기 비용) + 저장 비용 발생 | 파티션 단위 삭제 권장, 전체 삭제 시 비용 증가 |
예시로 이해하기
| 작업 유형 | 상황 설명 | 예상 비용 (USD) |
| Create (Batch Load) | 100GB 데이터 CSV 업로드 | $0 (무료) |
| Create (Streaming) | 10,000 행 스트리밍 삽입 | (10,000 / 200) × $0.01 = $0.50 |
| Read (쿼리) | 500GB 데이터 스캔 | (500 / 1024) × $5 ≈ $2.44 |
| Update | 200GB 대상 데이터 업데이트 | (200 / 1024) × $5 ≈ $0.98 + 저장 비용 |
| Delete | 100GB 파티션 삭제 | (100 / 1024) × $5 ≈ $0.49 + 저장 비용 |
Google BigQuery를 사용하는데 있어 제한이 없는만큼 데이터양과 CURD 작업 단계에서 부과 되는 요금은 체크하면서 작업하면 좋을 것 같습니다. 프로시저와 스케줄링을 사용하여 자동화하게 되면 주기적으로 실행되기 때문에 생각지도 못한 요금에 대해서 모두 대비하면서 사용하세요.
최신 마케팅/고객 데이터 활용 사례를 받아보실 수 있습니다.
비즈스프링 뉴스레터 구독하기 →