Otimize tarefas de carregamento

As estratégias e as práticas recomendadas descritas neste documento ajudam a otimizar o carregamento em lote ou o streaming de dados para o BigQuery, de modo a evitar atingir o limite do número de tarefas de carregamento por tabela e por dia.

Uma vez que o limite para tarefas de carregamento é fixo e não pode ser aumentado, deve otimizar as suas tarefas de carregamento estruturando as tabelas através de métodos como partições de tabelas ou gerindo os carregamentos através de métodos como carregamento em lote ou streaming.

Como funcionam as quotas de operações de tabelas

O limite do BigQuery para modificações de tabelas por tabela por dia por projeto é fixo, independentemente de as modificações acrescentarem ou atualizarem dados, ou truncarem a tabela. Este limite inclui o total combinado de todas as tarefas de carregamento, tarefas de cópia e tarefas de consulta que adicionam ou substituem uma tabela de destino.

Os trabalhos de carregamento têm uma taxa de reabastecimento. Se exceder o limite de operações de tabelas ou a respetiva taxa de reposição, as tarefas de carregamento falham com um erro quotaExceeded. O limite ao nível do projeto para tarefas de carregamento por dia é reposto num período de 24 horas. Quando as tarefas de carregamento terminam, a sua quota disponível diminui. A quota é, em seguida, reposta gradualmente ao longo das 24 horas seguintes. Os trabalhos de carregamento com falhas continuam a ser contabilizados para as quotas por tabela e por projeto. Para mais informações sobre os limites de tarefas de carregamento, consulte o artigo Tarefas de carregamento.

Para tabelas particionadas, aplica-se um limite separado para modificações de tabelas particionadas, que substitui o limite de tabelas padrão.

Para permanecer dentro dos limites de operações de tabelas diárias, distribua as operações por um período de 24 horas. Por exemplo, se fizer 25 atualizações, cada uma com 60 operações, pode executar cerca de 60 operações a cada 58 minutos. Esta abordagem ajuda a atingir o limite diário. Para monitorizar as atualizações das tabelas, consulte as vistas do INFORMATION_SCHEMA BigQuery.

Operações de tabela excluídas da quota

A atualização das informações da tabela (metadados) e a utilização de declarações DML não contam para o limite de modificação diária da tabela. Esta exclusão aplica-se a tabelas padrão e particionadas.

O seu projeto pode executar um número ilimitado de declarações DML. Embora as declarações DML fossem anteriormente contabilizadas para as modificações diárias de tabelas e não fossem restritas, mesmo no limite, já não o são.

As inserções de streaming também modificam as tabelas, mas são regidas pelas suas próprias quotas específicas.

Carregue estratégias para evitar o limite de operações de tabelas

Para permanecer dentro do limite de operações de tabelas diárias do BigQuery, considere estas práticas recomendadas:

  • Faça menos escritas maiores em vez de muitas escritas pequenas.
  • Minimize os trabalhos de escrita separados na tabela de produção final todos os dias.

Para usar estas práticas recomendadas, processe em lote ou faça stream dos seus dados para o BigQuery. A sua escolha do método de carregamento depende de precisar de carregar grandes volumes de dados em tempo real ou se o carregamento em tempo real não for um problema. As secções seguintes explicam o carregamento em lote e a transmissão de dados em detalhe, incluindo as ferramentas e os serviços que pode usar para cada método.

Carregamento em lote

Para permanecer dentro do limite de carregamento diário por projeto do BigQuery, processe grandes quantidades de dados em lote e carregue-os com menos tarefas no BigQuery. As secções seguintes descrevem vários métodos que pode usar para carregar os seus dados em lote.

Carregue mais dados para cada tarefa

Em vez de enviar dados para o BigQuery sempre que novas informações ficam disponíveis, recolha-os e carregue-os no BigQuery através de uma única tarefa grande.

Por exemplo, em vez de executar uma tarefa de carregamento separada para cada algumas linhas de dados, pode aguardar até acumular vários milhares de linhas de dados num ficheiro, por exemplo, num ficheiro CSV ou JSON, e, em seguida, executar uma tarefa de carregamento para anexar todos os dados a uma tabela. Esta ação conta como uma operação de tabela, mesmo que a tarefa contenha muito mais dados. Pode agrupar os ficheiros usando carateres universais com a tarefa de carregamento. Os carateres universais permitem-lhe selecionar lotes de ficheiros num diretório para carregar vários ficheiros num único trabalho de carregamento.

O exemplo seguinte mostra como usar carateres universais com o comando bq load ou consultas SQL LOAD DATA.

bq

O exemplo seguinte mostra um comando bq load para carregar dados CSV do Cloud Storage para uma tabela do BigQuery denominada my_target_table. Para selecionar mais do que um nome de ficheiro de origem, use um caráter universal com o comando. A flag AUTODETECT determina automaticamente o esquema da tabela a partir dos dados de origem no Cloud Storage e pode suportar um caráter universal (*) para carregar vários ficheiros que se enquadram num padrão de nomenclatura específico para a tabela do BigQuery.

bq load \
  --source_format=CSV \
  --autodetect \
  --project_id=PROJECT_ID \
  DATASET_NAME.TABLE_NAME \
  "gs://BUCKET_NAME/OBJECT_PATH_WILDCARD"

Substitua o seguinte:

  • PROJECT_ID: o ID do seu projeto Google Cloud .
  • DATASET_NAME: o nome do conjunto de dados do BigQuery onde quer carregar os dados.
  • TABLE_NAME: o nome da tabela do BigQuery onde quer carregar os dados.
  • BUCKET_NAME: o nome do seu contentor do Cloud Storage que contém os ficheiros de origem.
  • OBJECT_PATH_WILDCARD: o caminho para os seus ficheiros CSV no contentor do Cloud Storage. Inclua um caráter universal (*) para fazer a correspondência de vários ficheiros. Por exemplo, a string gs://my-bucket/path/to/data/my_prefix_*.csv usa o caráter universal * para carregar todos os ficheiros em gs://my-bucket/path/to/data/ que começam com my_prefix_ e terminam com .csv.

Para mais informações, consulte o seguinte:

SQL

O exemplo seguinte mostra como usar a consulta SQL LOAD DATA para carregar dados CSV de um contentor do Cloud Storage para uma tabela do BigQuery. Para selecionar mais do que um nome de ficheiro de origem, use um caráter universal com o comando.

LOAD DATA INTO
DATASET_NAME.TABLE_NAME
FROM FILES (
  format = 'SOURCE_FORMAT',
  uris = ['gs://BUCKET_NAME/OBJECT_PATH_WILDCARD]
  );

Substitua o seguinte:

  • DATASET_NAME: o nome do conjunto de dados do BigQuery onde quer carregar os dados.
  • TABLE_NAME: o nome da tabela do BigQuery onde quer carregar os dados.
  • O elemento SOURCE_FORMAT define o tipo dos seus ficheiros de origem, por exemplo, CSV ou JSON. Neste exemplo, use CSV.
  • BUCKET_NAME: o nome do seu contentor do Cloud Storage que contém os ficheiros de origem.
  • OBJECT_PATH_WILDCARD: o caminho para os seus ficheiros CSV no contentor do Cloud Storage. Inclua um caráter universal (*) para fazer a correspondência de vários ficheiros. Por exemplo, a string gs://my-bucket/path/to/data/my_prefix_*.csv usa o caráter universal * para carregar todos os ficheiros em gs://my-bucket/path/to/data/ que começam com my_prefix_ e terminam com .csv.

Para mais informações, consulte o artigo Carregue declarações no GoogleSQL.

Carregamento em lote com a API BigQuery Storage Write

Para carregar dados em lote para o BigQuery, uma opção é usar a API Storage Write diretamente a partir da sua aplicação com as bibliotecas de cliente da API Google.

A API Storage Write otimiza o carregamento de dados para permanecer dentro dos limites da tabela. Para streaming em tempo real de grande volume, use uma stream PENDING em vez de uma stream COMMITTED. Quando usa uma stream PENDING, a API armazena temporariamente registos até confirmar a stream.

Para ver um exemplo completo do carregamento de dados em lote com a API Storage Write, consulte o artigo Carregue dados em lote com a API Storage Write.

Carregamento em lote com o Dataflow

Se quiser fazer stream, transformar e escrever dados no BigQuery usando pipelines de dados, pode usar o Dataflow. Os pipelines de dados que cria leem a partir de origens suportadas, como o Pub/Sub ou o Apache Kafka. Também pode criar um pipeline do Dataflow com o conetor BigQueryIO, que usa a Storage Write API para streaming de dados de alto desempenho e semântica exatamente uma vez.

Para obter informações sobre como usar o Dataflow para carregar dados em lote para o BigQuery, consulte o artigo Escreva do Dataflow para o BigQuery.

Streaming de dados

Para carregar grandes volumes de dados com atualizações frequentes, recomendamos que transmita os seus dados para o BigQuery. Com o streaming de dados, os novos dados são escritos continuamente a partir da sua aplicação cliente no BigQuery, uma estratégia que evita atingir o limite de execução de demasiadas tarefas de carregamento. As secções seguintes descrevem vários métodos para transmitir os seus dados para o BigQuery.

Transmita dados através da API Storage Write

Use a API Storage Write para fazer stream de registos em tempo real para o BigQuery com latência mínima. A API Storage Write oferece um protocolo de streaming eficiente que disponibiliza funcionalidades avançadas, como a semântica de entrega exatamente uma vez, a deteção de atualizações de esquemas e as inserções/atualizações de captura de dados de alterações (CDC) de streaming. Além disso, pode carregar até 2 TiB por mês sem custo financeiro.

Para obter informações sobre a utilização da API Storage Write, consulte o artigo Fazer stream de dados com a API Storage Write.

Transmita dados através do Dataflow

Use o Dataflow para criar pipelines de dados que leiam a partir de origens suportadas, por exemplo, o Pub/Sub ou o Apache Kafka. Em seguida, estes pipelines transformam e escrevem os dados no BigQuery como destino. Pode criar um pipeline do Dataflow usando o conetor BigQueryIO, que usa a API Storage Write.

Para obter informações sobre a utilização do Dataflow para fazer stream de dados para o BigQuery, consulte o artigo Escreva do Dataflow para o BigQuery.

Práticas recomendadas para gerir as suas tabelas para carregamento

Além do carregamento em lote ou do streaming de dados para o BigQuery, pode gerir as tabelas das seguintes formas para as otimizar para a ingestão de dados.

Use tabelas particionadas

A partição de tabelas é uma técnica poderosa para gerir tabelas grandes no BigQuery, especialmente quando precisa de realizar operações de carregamento de dados frequentes. Pode melhorar significativamente o desempenho e a rentabilidade das tabelas dividindo-as em segmentos mais pequenos e mais fáceis de gerir com base numa data, numa data/hora ou num número inteiro.

A principal vantagem da partição para o carregamento de dados é que as quotas de operações de tabelas diárias para o BigQuery aplicam-se ao nível da partição e não ao nível da tabela. Para tabelas particionadas, aplica-se um limite separado e superior às modificações de partições, que substitui o limite de tabelas padrão. O limite para tabelas particionadas aumenta drasticamente o número de tarefas de carregamento que pode executar por dia sem atingir os limites de quota.

Uma estratégia comum e altamente eficaz é carregar em lote os seus dados diários. Por exemplo, pode recolher todos os dados do dia para 2025-09-18 numa tabela de preparação temporária. Em seguida, no final do dia, executa uma única tarefa para carregar estes dados na partição específica deste dia na sua tabela de produção principal. Uma vez que o BigQuery interage apenas com os dados de uma única partição, esta abordagem mantém os seus dados bem organizados e torna as operações de carregamento mais rápidas e menos dispendiosas.

Embora a partição seja altamente recomendada para tabelas grandes e em crescimento, é melhor evitá-la se as partições forem sempre inferiores a 10 GB. Para mais informações, consulte o artigo Quando usar a partição.

Para saber mais acerca dos diferentes métodos de partição disponíveis, como a partição por unidade de tempo e por intervalo de números inteiros, consulte Tipos de tabelas particionadas.

Tire partido da retirada exponencial, do truncamento e da variação incorporados

A retirada exponencial e a repetição incorporadas são um método de processamento de erros que ajuda a sua aplicação a recuperar sem problemas quando uma operação falha temporariamente. Essas falhas podem incluir um erro de limite de taxa (rateLimitExceeded) ou um breve problema de rede (unavailable).

Num sistema fiável, os trabalhadores que recebem tarefas da fila do lado do cliente também usam a retirada exponencial e a repetição. Isto é feito quando chama o BigQuery, o que cria dois níveis de proteção.

Por exemplo, a biblioteca oficial google-cloud-bigquery-storage para Python inclui lógica de repetição integrada com retirada exponencial. Esta lógica processa erros gRPC temporários, por exemplo, UNAVAILABLE. Na maioria dos casos, não precisa de escrever este código de nova tentativa. A chamada client.append_rows() processa estas tentativas automaticamente.

Este processamento incorporado é uma vantagem significativa da utilização das bibliotecas de cliente oficiais. Só tem de resolver os erros que não podem ser repetidos, por exemplo, INVALID_ARGUMENT, o que significa que existe uma incompatibilidade de esquema.