BigQuery é o data warehouse serverless e colunar do GCP. Executa queries SQL analíticas sobre petabytes de dados sem necessidade de gerenciar clusters ou infraestrutura.

Nasceu do Dremel, tecnologia interna do Google, e separa completamente storage de compute.

Arquitetura

graph LR
    subgraph BigQuery
        A["Dremel - SQL Engine"] <-->|queries| B["Capacitor / Colossus - Storage"]
    end

Storage e compute são independentes e escaláveis de forma separada.

Hierarquia de objetos

graph TD
    P[Project] --> D[Dataset]
    D --> T[Table]
    D --> V[View]
    D --> R[Routine]
  • Dataset: equivale a um schema/banco em SQL tradicional. Tem região definida na criação.
  • Tabela nativa: dados armazenados no Colossus (storage proprietário do Google).
  • Tabela externa: query sobre dados no GCS, Google Sheets, etc., sem ingestão.
  • View materializada: resultado de query persistido e atualizado automaticamente.

Modelos de cobrança

ModoComo funcionaQuando usar
On-demandPaga por TB processado (~$6.25/TB)Cargas imprevisíveis
Capacity (slots)Reserva slots de compute por hora/mêsCargas previsíveis e altas
AutoscaleSlots sob demanda com baseline reservadoHíbrido

Slot = unidade de compute do BigQuery. 1 query pode usar centenas de slots em paralelo.

Particionamento

Divide a tabela fisicamente para reduzir bytes lidos (= custo e velocidade):

-- Por coluna DATE/TIMESTAMP
CREATE TABLE meu_dataset.eventos
PARTITION BY DATE(event_timestamp)
AS SELECT * FROM source;
 
-- Por coluna INTEGER (range)
CREATE TABLE meu_dataset.pedidos
PARTITION BY RANGE_BUCKET(cliente_id, GENERATE_ARRAY(0, 1000, 100));
 
-- Por ingest time (automático)
CREATE TABLE meu_dataset.logs
PARTITION BY _PARTITIONDATE;

Sempre filtrar pela coluna de partição no WHERE para aproveitar partition pruning.

Clustering

Ordena os dados dentro de cada partição por até 4 colunas. Reduz bytes lidos em filtros e JOINs:

CREATE TABLE meu_dataset.vendas
PARTITION BY DATE(data_venda)
CLUSTER BY regiao, produto_id
AS SELECT * FROM source;

Clustering é mais eficiente que índices tradicionais: o BigQuery reordena automaticamente à medida que os dados crescem.

Carregamento de dados

-- Criar tabela a partir de GCS (bq load)
bq load \
  --source_format=PARQUET \
  meu_dataset.tabela \
  gs://meu-bucket/dados/*.parquet
 
-- INSERT via SQL
INSERT INTO meu_dataset.tabela SELECT * FROM outra_tabela;
 
-- Merge (upsert)
MERGE meu_dataset.destino AS T
USING meu_dataset.staging AS S
ON T.id = S.id
WHEN MATCHED THEN UPDATE SET T.valor = S.valor
WHEN NOT MATCHED THEN INSERT VALUES (S.id, S.valor);

Tabelas externas e BigLake

-- Tabela externa sobre GCS (Parquet)
CREATE EXTERNAL TABLE meu_dataset.eventos_ext
OPTIONS (
  format = 'PARQUET',
  uris = ['gs://meu-bucket/raw/*.parquet']
);

BigLake estende tabelas externas com controle de acesso por coluna/linha e cache gerenciado, permitindo governance sem mover os dados.

Recursos úteis

  • BI Engine: cache in-memory para queries de BI (Looker Studio, Tableau) com latência sub-segundo
  • BigQuery ML: treina modelos ML diretamente com SQL (CREATE MODEL)
  • Scheduled Queries: queries agendadas via UI/API sem Airflow
  • Authorized Views: views com ACL própria, úteis para row-level security
  • Information Schema: metadados sobre jobs, tabelas, slots e consumo
-- Jobs recentes e bytes processados
SELECT job_id, query, total_bytes_processed, total_slot_ms
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE DATE(creation_time) = CURRENT_DATE()
ORDER BY total_bytes_processed DESC
LIMIT 20;

Deep dive

Ver também: gcp | gcp-cloud-storage | gcp-dataflow | gcp-dataplex | gcp-looker | gcp-boas-praticas | arquitetura-medalhao | data-lake-lakehouse