Práticas recomendadas do BigQuery: como controlar custos

Veja nesta página as práticas recomendadas para controlar custos no BigQuery.

Evitar SELECT *

Prática recomendada: consulte somente as colunas necessárias.

Usar SELECT * é a maneira mais cara de consultar dados. Quando você usa SELECT *, o BigQuery faz uma verificação completa de todas as colunas da tabela.

Se você estiver testando ou explorando dados, use uma das opções de visualização de dados em vez de SELECT *.

A aplicação de uma cláusula LIMIT a uma consulta SELECT * não afeta a quantidade de dados lidos. A cobrança ocorre em relação à leitura de todos os bytes em toda a tabela, e a consulta é contabilizada na sua cota de nível gratuito.

Em vez disso, consulte apenas as colunas de que você precisa. Por exemplo, use SELECT * EXCEPT para excluir uma ou mais colunas dos resultados.

Se você precisar fazer a consulta em todas as colunas de uma tabela, mas apenas em um subconjunto de dados, faça o seguinte:

  • Materialize os resultados em uma tabela de destino e realize a consulta nessa tabela.
  • Particione suas tabelas por data e consulte a partição relevante. Por exemplo, WHERE _PARTITIONDATE="2017-01-01" analisa somente a partição de 1º de janeiro de 2017.

Dados de amostra com opções de visualização

Prática recomendada: não faça consultas para explorar ou visualizar dados da tabela.

Se você estiver fazendo testes ou explorando dados, pode usar a opção de visualização da tabela para visualizar dados gratuitamente sem afetar suas cotas.

O BigQuery é compatível com as opções de visualização de dados a seguir:

  • No Console do Cloud ou na IU da Web clássica, na página de detalhes da tabela, clique na guia Visualizar para criar amostras dos dados.
  • No CLI, use o comando bq head e especifique o número de linhas que quer visualizar.
  • Na API, use tabledata.list para recuperar os dados da tabela de um conjunto de linhas especificado.

Calcular o preço das consultas antes de executá-las

Prática recomendada: antes de executar consultas, visualize-as para tentar estimar os custos.

As consultas são cobradas de acordo com o número de bytes lidos. Para estimar custos antes de executar uma consulta:

  • Visualize o validador de consultas no Console do Cloud ou na IU da Web clássica.
  • Use a Calculadora de preços do Google Cloud Platform.
  • Execute uma simulação usando:
    • a sinalização --dry_run na CLI;
    • o parâmetro dryRun ao nviar um job de consulta usando a API.

Como usar o validador de consulta

Quando você insere uma consulta no Console do Cloud ou na IU da Web clássica, o validador de consulta verifica a sintaxe da consulta e fornece uma estimativa do número de bytes lidos. Essa estimativa pode ser usada para calcular o custo da consulta na calculadora de preços.

Validador de consulta

Como executar uma simulação

Para executar uma simulação:

Console

No momento, não é possível executar uma simulação usando o Console do Cloud.

IU clássica

No momento, não é possível executar uma simulação usando a IU da Web.

CLI

Insira uma consulta como a seguinte usando a sinalização --dry_run.

bq query \
--use_legacy_sql=false \
--dry_run \
'SELECT
   COUNTRY,
   AIRPORT,
   IATA
 FROM
   `project_id`.dataset.airports
 LIMIT
   1000'
 

O comando gera a resposta a seguir:

Query successfully validated. Assuming the tables are not modified,
running this query will process 10918 bytes of data.

API

Para fazer uma simulação usando a API, envie um job de consulta com dryRun definido como true na configuração do job.

Go

Antes de testar esta amostra, siga as instruções de configuração do Go no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery Go .

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
)

// queryDryRun demonstrates issuing a dry run query to validate query structure and
// provide an estimate of the bytes scanned.
func queryDryRun(w io.Writer, projectID string) error {
	// projectID := "my-project-id"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}

	q := client.Query(`
	SELECT
		name,
		COUNT(*) as name_count
	FROM ` + "`bigquery-public-data.usa_names.usa_1910_2013`" + `
	WHERE state = 'WA'
	GROUP BY name`)
	q.DryRun = true
	// Location must match that of the dataset(s) referenced in the query.
	q.Location = "US"

	job, err := q.Run(ctx)
	if err != nil {
		return err
	}
	// Dry run is not asynchronous, so get the latest status and statistics.
	status := job.LastStatus()
	if err != nil {
		return err
	}
	fmt.Fprintf(w, "This query will process %d bytes\n", status.Statistics.TotalBytesProcessed)
	return nil
}

Python

Para executar uma simulação usando a biblioteca de cliente em Python, configure a propriedade QueryJobConfig.dry_run como True. Se uma configuração de consulta de simulação for fornecida, Client.query() sempre retornará um QueryJob concluído (links em inglês).

Antes de testar esta amostra, siga as instruções de configuração do Python no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery Python.

from google.cloud import bigquery

# TODO(developer): Construct a BigQuery client object.
# client = bigquery.Client()

job_config = bigquery.QueryJobConfig(dry_run=True, use_query_cache=False)

# Start the query, passing in the extra configuration.
query_job = client.query(
    (
        "SELECT name, COUNT(*) as name_count "
        "FROM `bigquery-public-data.usa_names.usa_1910_2013` "
        "WHERE state = 'WA' "
        "GROUP BY name"
    ),
    job_config=job_config,
)  # Make an API request.

# A dry run query completes immediately.
print("This query will process {} bytes.".format(query_job.total_bytes_processed))

Como usar a calculadora de preços

Para estimar os custos de consulta na Calculadora de preços do Google Cloud, insira o número de bytes processados pela consulta como MB, GB, TB ou PB. Se sua consulta processa menos de 1 TB, a estimativa é US$ 0. O BigQuery fornece gratuitamente 1 TB de processamento de consultas sob demanda mensal.

Calculadora de preços

Limitar os custos de consulta restringindo o número de bytes cobrados

Prática recomendada: use a configuração máxima de bytes cobrados para limitar os custos de consulta.

Você pode limitar o número de bytes cobrados para uma consulta usando a configuração máxima de bytes cobrados. Quando você define o máximo de bytes cobrados, se a consulta ler bytes além do limite, ela apresentará falha sem incorrer em uma cobrança.

Se uma consulta apresentar falha devido à configuração máxima de bytes cobrados, um erro como este será retornado:

Error: Query exceeded limit for bytes billed: 1000000. 10485760 or higher required.

Para definir o máximo de bytes cobrados:

  • Na IU da web clássica do BigQuery, digite um número inteiro no campo Máximo de bytes cobrados nas opções de consulta. Atualmente, o Console do Cloud não permite a opção Cobrança máxima de bytes. Máximo de bytes cobrados
  • Na CLI, use o comando bq query com a sinalização --maximum_bytes_billed.

    bq query --maximum_bytes_billed=1000000 \
    --use_legacy_sql=false \
    'SELECT
       word
     FROM
       `bigquery-public-data`.samples.shakespeare'
    
  • Na API, defina a propriedade maximumBytesBilled na configuração de job query.

A opção LIMIT não afeta os custos

Prática recomendada: não use uma cláusula LIMIT como método de controle de custos.

Aplicar uma cláusula LIMIT a uma consulta não afeta a quantidade de dados lidos. Apenas limita os resultados. A cobrança ocorre com base na leitura de todos os bytes em toda a tabela conforme indicado pela consulta.

A quantidade de dados lidos pela consulta é contabilizada com relação à sua cota de nível gratuito, mesmo com a presença de uma cláusula LIMIT.

Ver os custos usando um painel e consultar os registros de auditoria

Prática recomendada: crie um painel para visualizar seus dados de cobrança e faça ajustes no uso do BigQuery. Também é possível transmitir seus registros de auditoria ao BigQuery para analisar os padrões de uso.

É possível exportar os dados de faturamento para o BigQuery e visualizá-los em uma ferramenta, como o Google Data Studio. Para ver um tutorial sobre como criar um painel de faturamento, consulte Visualizar o faturamento do GCP usando o BigQuery e o Google Data Studio (em inglês).

É possível também fazer streaming dos registros de auditoria para o BigQuery e analisá-los para verificar os padrões de uso, como custos de consulta por usuário.

Particionar dados por data

Prática recomendada: particione suas tabelas por data.

Se possível, particione suas tabelas do BigQuery por data. Dessa forma, é possível consultar subconjuntos de dados relevantes, a fim de melhorar o desempenho e reduzir os custos.

Por exemplo, quando você consultar tabelas particionadas, use a pseudocoluna _PARTITIONTIME para filtrar por uma data ou um intervalo de datas. A consulta processa dados apenas nas partições especificadas pela data ou intervalo.

Materializar os resultados da consulta em etapas

Prática recomendada: se possível, materialize os resultados da consulta em etapas.

Se você criar uma consulta grande e de vários estágios, cada vez que você a executar, o BigQuery lerá todos os dados exigidos por ela. A cobrança será realizada com base em todos os dados lidos sempre que a consulta for executada.

Em vez disso, divida sua consulta em etapas de modo que cada uma materialize os resultados da consulta, gravando-os em uma tabela de destino. Consultar a tabela de destino menor reduz a quantidade de dados lidos e reduz os custos. O custo de armazenamento de resultados materializados é muito inferior ao custo do processamento de grandes quantidades de dados.

Considerar o custo de grandes conjuntos de resultados

Prática recomendada: se você estiver gravando grandes resultados de consulta em uma tabela de destino, use o prazo de validade padrão da tabela para remover os dados quando não forem mais necessários.

Manter grandes conjuntos de resultados no armazenamento do BigQuery gera um custo. Se você não precisa de acesso permanente aos resultados, use a expiração padrão da tabela para excluir os dados automaticamente para você.

Para mais informações, consulte preços de armazenamento.

Usar inserções de streaming com cautela

Prática recomendada: use as inserções de streaming somente se for necessário que seus dados estejam imediatamente disponíveis.

Não há cobranças para carregar dados no BigQuery. No entanto, há cobranças para transmitir dados ao BigQuery. A menos que precisem estar prontamente disponíveis, carregue os dados em vez de transmiti-los.