Estimar e controlar custos

Nesta página, descrevemos como estimar custos e listamos as práticas recomendadas para controlar custos no BigQuery. O BigQuery oferece dois tipos de modelos de preços: sob demanda e com base em capacidade. Para informações sobre preços, consulte Preços do BigQuery.

Com o BigQuery, é possível estimar o custo de executar uma consulta, calcular o byte processado por várias consultas e receber uma estimativa de custo mensal com base no uso projetado. Para controlar os custos, você também precisa seguir as práticas recomendadas para otimizar o cálculo da consulta e o armazenamento do BigQuery. Para ver práticas recomendadas específicas de custo, confira Controlar custos de consulta.

Para monitorar os custos de consulta e o uso do BigQuery, analise os registros de auditoria do BigQuery.

Estimar custos de consulta

O BigQuery oferece vários métodos para estimar custos:

Cálculo do tamanho da consulta sob demanda

Para calcular o número de bytes processados pelos vários tipos de consulta usando o modelo de faturamento sob demanda, consulte as seguintes seções:

Consultar formatos em colunas no Cloud Storage

Se os dados externos forem armazenados no ORC ou no Parquet, o número de bytes cobrados será limitado às colunas que são lidas pelo BigQuery. Como os tipos de dados de uma fonte de dados externa são convertidos em tipos de dados do BigQuery pela consulta, o número de bytes lidos é calculado com base no tamanho dos tipos de dados do BigQuery. Para informações sobre conversões de tipos de dados, consulte as seguintes páginas:

Use a calculadora de preços do Google Cloud

A calculadora de preços do Google Cloud pode ajudar a criar uma estimativa de custo mensal geral para o BigQuery com base na projeção de uso.

Sob demanda

Para estimar os custos na Calculadora de preços do Google Cloud ao usar o modelo de preços sob demanda, siga estas etapas:

  1. Abra a Calculadora de preços do Google Cloud.
  2. Clique em BigQuery.
  3. Clique na guia Sob demanda.
  4. Digite o Nome da tabela. Por exemplo, airports.
  5. Em Preço de armazenamento, insira o tamanho estimado da tabela nos campos de armazenamento. Você só precisa estimar o armazenamento físico ou o armazenamento lógico, dependendo do modelo de faturamento do armazenamento do conjunto de dados.
  6. Para Preços de consulta, insira os bytes estimados lidos da sua simulação ou do validador de consulta.
  7. Clique em Adicionar à estimativa.
  8. A estimativa aparece à direita. É possível salvar ou enviar a estimativa por e-mail.

Para saber mais informações, consulte Preços sob demanda.

Edições

Para estimar os custos na calculadora de preços do Google Cloud ao usar o modelo de preços baseado em capacidade com as edições do BigQuery, siga estas etapas:

  1. Abra a Calculadora de preços do Google Cloud.
  2. Clique em BigQuery.
  3. Clique na guia Edições.
  4. Escolha o local onde os slots são usados.
  5. Escolha sua Edição.
  6. Escolha as opções Slots máximos, Slots de referência, Compromisso opcionais e Uso estimado do escalonamento automático.
  7. Escolha o local onde os dados são armazenados.
  8. Insira suas estimativas de uso para Armazenamento ativo, Armazenamento de longo prazo, Inserções por streaming e Leituras de streaming. Você só precisa estimar o armazenamento físico ou o lógico, dependendo do modelo de faturamento do armazenamento do conjunto de dados.
  9. Clique em Adicionar à estimativa.

Para mais informações, consulte os preços baseados em capacidade.

Controlar os custos de consulta

Para otimizar os custos de consulta, verifique se você tem armazenamento otimizado e computação de consultas. Para ver outros métodos de controle do custo da consulta, consulte as seguintes seções:

Verifique o custo da consulta antes de executá-la

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:

Usar o validador de consultas

Quando você insere uma consulta no console do Google Cloud, o validador verifica a sintaxe da consulta e fornece uma estimativa do número de bytes lidos. Esta estimativa pode ser usada para calcular o custo da consulta na calculadora de preços.

  • Se a consulta não for válida, o validador de consultas exibirá uma mensagem de erro. Exemplo:

    Not found: Table myProject:myDataset.myTable was not found in location US

  • Se a consulta for válida, o validador de consulta fornecerá uma estimativa do número de bytes necessários para processar a consulta. Exemplo:

    This query will process 623.1 KiB when run.

Executar uma simulação

Para executar uma simulação, faça o seguinte:

Console

  1. Acesse a página do BigQuery.

    Acessar o BigQuery

  2. Digite a consulta no Editor de consultas.

    Se a consulta for válida, uma marca de seleção será exibida junto com a quantidade de dados que serão processados pela consulta. Se a consulta for inválida, um ponto de exclamação será exibido com uma mensagem de erro.

bq

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'
 

Para uma consulta válida, o comando produz a seguinte resposta:

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

API

Para executar uma simulação usando a API, envie um job de consulta com dryRun definido como true no tipo JobConfiguration.

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 em Go.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, acesse Configurar a autenticação para bibliotecas de cliente.

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)
	}
	defer client.Close()

	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 := status.Err(); err != nil {
		return err
	}
	fmt.Fprintf(w, "This query will process %d bytes\n", status.Statistics.TotalBytesProcessed)
	return nil
}

Java

Antes de testar esta amostra, siga as instruções de configuração do Java 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 em Java.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, acesse Configurar a autenticação para bibliotecas de cliente.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.JobStatistics;
import com.google.cloud.bigquery.QueryJobConfiguration;

// Sample to run dry query on the table
public class QueryDryRun {

  public static void runQueryDryRun() {
    String query =
        "SELECT name, COUNT(*) as name_count "
            + "FROM `bigquery-public-data.usa_names.usa_1910_2013` "
            + "WHERE state = 'WA' "
            + "GROUP BY name";
    queryDryRun(query);
  }

  public static void queryDryRun(String query) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      QueryJobConfiguration queryConfig =
          QueryJobConfiguration.newBuilder(query).setDryRun(true).setUseQueryCache(false).build();

      Job job = bigquery.create(JobInfo.of(queryConfig));
      JobStatistics.QueryStatistics statistics = job.getStatistics();

      System.out.println(
          "Query dry run performed successfully." + statistics.getTotalBytesProcessed());
    } catch (BigQueryException e) {
      System.out.println("Query not performed \n" + e.toString());
    }
  }
}

Node.js

Antes de testar esta amostra, siga as instruções de configuração do Node.js 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 em Node.js.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, acesse Configurar a autenticação para bibliotecas de cliente.

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function queryDryRun() {
  // Runs a dry query of the U.S. given names dataset for the state of Texas.

  const query = `SELECT name
    FROM \`bigquery-public-data.usa_names.usa_1910_2013\`
    WHERE state = 'TX'
    LIMIT 100`;

  // For all options, see https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query
  const options = {
    query: query,
    // Location must match that of the dataset(s) referenced in the query.
    location: 'US',
    dryRun: true,
  };

  // Run the query as a job
  const [job] = await bigquery.createQueryJob(options);

  // Print the status and statistics
  console.log('Status:');
  console.log(job.metadata.status);
  console.log('\nJob Statistics:');
  console.log(job.metadata.statistics);
}

PHP

Antes de testar esta amostra, siga as instruções de configuração do PHP 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 em PHP.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, acesse Configurar a autenticação para bibliotecas de cliente.

use Google\Cloud\BigQuery\BigQueryClient;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $query = 'SELECT id, view_count FROM `bigquery-public-data.stackoverflow.posts_questions`';

// Construct a BigQuery client object.
$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);

// Set job configs
$jobConfig = $bigQuery->query($query);
$jobConfig->useQueryCache(false);
$jobConfig->dryRun(true);

// Extract query results
$queryJob = $bigQuery->startJob($jobConfig);
$info = $queryJob->info();

printf('This query will process %s bytes' . PHP_EOL, $info['statistics']['totalBytesProcessed']);

Python

Defina 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 em Python.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, acesse Configurar a autenticação para bibliotecas de cliente.

from google.cloud import bigquery

# 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))

Evitar executar consultas para explorar dados de tabelas

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:

  • Na página de detalhes da tabela no console do Google Cloud, clique na guia Visualização para criar uma amostra dos dados.
  • Na ferramenta de linha de comando bq, 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.
  • Evite usar LIMIT em tabelas que não estão em cluster. Para tabelas que não estão em cluster, uma cláusula LIMIT não reduzirá os custos de computação.

Restringir o número de bytes faturados

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, o número de bytes lidos pela consulta é estimado antes da execução da consulta. Se o número de bytes estimados estiver além do limite, a consulta falhará sem gerar cobranças.

Para tabelas em cluster, a estimativa do número de bytes cobrados para uma consulta é um limite superior e pode ser maior que o número real de bytes cobrados depois de executar a consulta. Em alguns casos, se você definir o máximo de bytes cobrados, uma consulta em uma tabela em cluster poderá falhar, mesmo que os bytes reais faturados não excedam a configuração máxima de bytes cobrados.

Se uma consulta falhar devido à configuração máxima de bytes faturados, um erro semelhante a este será retornado:

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

Para definir o máximo de bytes cobrados:

Console

  1. No Editor de consultas, clique em Mais > Configurações de consulta > Opções avançadas.
  2. No campo Máximo de bytes faturados, insira um número inteiro.
  3. Clique em Salvar.

bq

Use o comando bq querycom a sinalização --maximum_bytes_billed.

  bq query --maximum_bytes_billed=1000000 \
  --use_legacy_sql=false \
  'SELECT
     word
   FROM
     `bigquery-public-data`.samples.shakespeare'

API

Defina a propriedade maximumBytesBilled em JobConfigurationQuery ou QueryRequest.

Evite usar LIMIT em tabelas não em cluster

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

Para tabelas não em cluster, aplicar uma cláusula LIMIT a uma consulta não afeta a quantidade de dados lidos. Você é cobrado pela leitura de todos os bytes em toda a tabela conforme indicado pela consulta, mesmo que ela retorne apenas um subconjunto. Com uma tabela em cluster, uma cláusula LIMIT pode reduzir o número de bytes verificados, porque a verificação é interrompida quando blocos suficientes são verificados para conseguir o resultado. Você receberá cobranças apenas pelos bytes verificados.

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. Você também pode transmitir seus registros de auditoria ao BigQuery para analisar os padrões de uso.

É possível exportar seus dados de faturamento para o BigQuery e visualizá-los em uma ferramenta como o Looker Studio. Para ver um tutorial sobre como criar um painel de faturamento, consulte Visualizar o faturamento do Google Cloud usando o BigQuery e o Looker Studio.

É 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.

Materialize 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.

Usar a expiração da tabela para tabelas de destino

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 armazenados no 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.

A seguir