Google BigQuery Internals: Slots, Particionamento e Performance
A Arquitetura Dremel
O BigQuery não é apenas um banco de dados, é um motor de query distribuído baseado no paper Dremel do Google. Ele separa Compute (Slots) de Storage (Colossus) conectados pela rede Jupiter de petabit/s.
O que são Slots?
Um Slot é uma unidade virtual de CPU e RAM. Quando você roda uma query, o BigQuery aloca dinamicamente slots para processar estágios da query. Clientes Enterprise podem comprar "Slot Reservations" para garantir performance constante.
Otimização via SQL
A forma como você escreve SQL impacta diretamente quantos slots são necessários e quantos bytes são lidos (custo).
1. Partitioning (Obrigatório)
Sempre particione tabelas grandes por data ou inteiro. Isso permite o Partition Pruning.
-- CREATE TABLE com particionamento
CREATE TABLE dataset.logs (
event_timestamp TIMESTAMP,
user_id STRING,
message STRING
)
PARTITION BY DATE(event_timestamp);
-- Query Otimizada (Lê apenas a partição do dia)
SELECT * FROM dataset.logs
WHERE DATE(event_timestamp) = '2026-01-25';
2. Clustering (Otimização Fina)
Dentro da partição, ordene os dados por colunas frequentemente filtradas (ex: user_id).
CREATE TABLE dataset.users_clustered
PARTITION BY DATE(created_at)
CLUSTER BY user_id
AS SELECT * FROM dataset.raw_users;
BigQuery UDFs (User Defined Functions)
Para lógica complexa que o SQL padrão não resolve, use JavaScript UDFs. Elas rodam dentro dos slots do BigQuery, escalando massivamente.
CREATE TEMP FUNCTION json_extract_keys(json_str STRING)
RETURNS ARRAY
LANGUAGE js AS """
try {
var obj = JSON.parse(json_str);
return Object.keys(obj);
} catch (e) { return []; }
""";
SELECT json_extract_keys(json_payload) as keys
FROM dataset.events;
Conclusão
O BigQuery é poderoso, mas "com grandes poderes vêm grandes faturas". Monitorar o uso de slots e bytes processados via INFORMATION_SCHEMA é tarefa obrigatória para qualquer Data Lead.
./SUBSCRIBE_UPDATES
// Receba dicas de FinOps, cases de otimização e novidades sobre engenharia de dados.