Controla los costos en BigQuery

En esta página, se describen las prácticas recomendadas para controlar los costos en BigQuery.

Evita SELECT *

Práctica recomendada: consulta solo las columnas que necesitas.

Usar SELECT * es la forma más costosa de consultar datos. Cuando usas SELECT *, BigQuery realiza un análisis completo de cada columna de la tabla.

Si realizas experimentos o exploración en los datos, usa una de las opciones de vista previa de datos en lugar de SELECT *.

La aplicación de una cláusula LIMIT a una consulta SELECT * no afecta la cantidad de datos leídos. Se te cobra por leer todos los bytes en la tabla completa y la consulta cuenta para tu cuota de nivel gratuito.

En su lugar, consulta solo las columnas que necesitas. Por ejemplo, usa SELECT * EXCEPT para excluir una o más columnas de los resultados.

Si realmente necesitas consultar todas las columnas de una tabla, pero solo en un subconjunto de datos, considera estas opciones:

  • Materializar los resultados en una tabla de destino y ejecutar la consulta sobre esa tabla en lugar de la original
  • Particionar tus tablas por fecha y consultar la partición relevante; por ejemplo, WHERE _PARTITIONDATE="2017-01-01" solo analiza la partición del 1 de enero de 2017

Realiza un muestreo de los datos con las opciones de vista previa

Recomendación: No ejecutes consultas para explorar los datos de las tablas ni obtener una vista previa de ellos.

Si exploras tus datos o experimentas con ellos, puedes usar las opciones de vista previa de tablas de forma gratuita sin afectar las cuotas.

BigQuery es compatible con las siguientes opciones de vista previa de datos:

  • En Cloud Console o en la IU web clásica, en la página de detalles de la tabla, haz clic en la pestaña Vista previa para hacer un muestreo de los datos.
  • En la herramienta de línea de comandos de bq, usa el comando bq head y especifica la cantidad de filas para la vista previa.
  • En la API, usa tabledata.list para recuperar los datos de un conjunto específico de filas de la tabla.

Obtén el precio de tus consultas antes de ejecutarlas

Recomendación: Antes de ejecutar consultas, obtén una vista previa para estimar los costos.

Las consultas se facturan según el número de bytes leídos. Para estimar los costos antes de ejecutar una consulta, haz lo siguiente:

  • Accede al validador de consultas en Cloud Console o la IU web clásica.
  • Usa la calculadora de precios de Google Cloud Platform
  • Realiza una ejecución de prueba mediante estos elementos:
    • La marca --dry_run en la herramienta de línea de comandos de bq
    • El parámetro dryRun cuando se envía un trabajo de consulta mediante la API

Usa el validador de consultas

Cuando ingresas una consulta en Cloud Console o en la IU web clásica, el validador de consultas verifica la sintaxis de la consulta y proporciona una estimación del número de bytes leídos. Puedes usar esta estimación para calcular el costo de la consulta en la calculadora de precios.

Validador de consultas

Realiza una ejecución de prueba

Para realizar una ejecución de prueba, haz lo siguiente:

Console

En la actualidad, no puedes realizar una ejecución de prueba con Cloud Console.

IU clásica

En la actualidad, no puedes realizar una ejecución de prueba con la IU web.

bq

Ingresa una consulta como la siguiente con la marca --dry_run.

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

El comando genera la siguiente respuesta:

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

API

Para realizar una ejecución de prueba mediante la API, envía un trabajo de consulta con dryRun configurado como true en el tipo JobConfiguration.

Go

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go que se encuentran en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Go de BigQuery.

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

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java que se encuentran en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

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());
    }
  }
}

Python

Para realizar una ejecución de prueba con la biblioteca cliente de Python, configura la propiedad QueryJobConfig.dry_run como True. Client.query() siempre muestra un QueryJob completo cuando se proporciona una configuración de consulta de ejecución de prueba.

Antes de probar esta muestra, sigue las instrucciones de configuración para Python incluidas en la Guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de BigQuery para 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))

Usa la calculadora de precios

Para estimar los costos de consulta en la calculadora de precios de Google Cloud Platform, ingresa la cantidad de bytes que procesa la consulta en MB, GB, TB o PB. Si tu consulta procesa menos de 1 TB, la estimación es de $0 porque BigQuery proporciona 1 TB de procesamiento de consultas a pedido gratis por mes.

Calculadora de precios.

Restringe la cantidad de bytes facturados para limitar los costos de consulta

Recomendación: Usa la configuración de máximo de bytes facturados para limitar los costos de consulta.

Puedes limitar la cantidad de bytes facturados para una consulta mediante la configuración de máximo de bytes facturados. Cuando estableces un máximo de bytes facturados, si la consulta lee más bytes que el máximo, esta falla sin incurrir en un cargo.

Si una consulta falla debido a la configuración de máximo de bytes facturados, se muestra un error como el siguiente:

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

Para configurar el máximo de bytes facturados, haz lo siguiente:

Console

  1. En el Editor de consultas, haz clic en Más, luego en Configuración de consulta y, a continuación, haz clic en Opciones avanzadas.
  2. En el campo Máximo de bytes facturados, ingresa un número entero.
  3. Haga clic en Save.

bq

Usa el comando bq query con la marca --maximum_bytes_billed.

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

API

Establece la propiedad maximumBytesBilled en JobConfigurationQuery o QueryRequest.

LIMIT no afecta el costo

Práctica recomendada: no uses una cláusula LIMIT como método de control de costos.

Aplicar una cláusula LIMIT a una consulta no afecta la cantidad de datos leídos. Solo limita la salida del conjunto de resultados. Se te cobra por leer todos los bytes en la tabla completa según lo indica la consulta.

La cantidad de datos que lee la consulta cuenta para tu cuota de nivel gratuito a pesar de la presencia de una cláusula LIMIT.

Visualiza los costos con un panel y consulta tus registros de auditoría

Recomendación: Crea un panel a fin de ver tus datos de facturación para poder realizar ajustes en tu uso de BigQuery. También considera transmitir tus registros de auditoría a BigQuery para poder analizar los patrones de uso.

Puedes exportar tus datos de facturación a BigQuery y visualizarlos en una herramienta como Google Data Studio. Para ver un instructivo acerca de cómo crear un panel de facturación, consulta Visualiza la facturación de GCP con BigQuery y Google Data Studio.

También puedes transmitir tus registros de auditoría a BigQuery y analizarlos en busca de patrones de uso, como los costos de consulta por usuario.

Haz particiones de los datos por fecha

Práctica recomendada: particiona tus tablas por fecha.

Si es posible, haz particiones de tus tablas de BigQuery por fecha. La partición de tus tablas te permite consultar subconjuntos de datos relevantes, lo que mejora el rendimiento y reduce los costos.

Por ejemplo, cuando consultes tablas particionadas, usa la seudocolumna _PARTITIONTIME para filtrar por fecha o período. La consulta procesa datos solo en las particiones que especifican la fecha o el período.

Materializa los resultados de la consulta en etapas

Recomendación: Si es posible, materializa los resultados de tu consulta en etapas.

Si creas una consulta grande de varias etapas, BigQuery lee todos los datos que requiere cada vez que la ejecutas. Se te factura por todos los datos que se leen cada vez que se ejecuta la consulta.

En su lugar, divide tu consulta en etapas que materialicen los resultados de la consulta mediante la escritura en una tabla de destino. Consultar la tabla de destino más pequeña reduce los costos y la cantidad de datos que se leen. El costo de almacenar los resultados materializados es mucho menor que el de procesar grandes cantidades de datos.

Considera el costo de conjuntos de resultados de gran tamaño

Práctica recomendada: si escribes resultados de consulta de gran tamaño en una tabla de destino, usa el tiempo de vencimiento de tabla predeterminado para quitar los datos cuando ya no sean necesarios.

Mantener conjuntos de resultados de gran tamaño en el almacenamiento de BigQuery tiene un costo. Si no necesitas acceso permanente a los resultados, usa el vencimiento de tabla predeterminado para borrar los datos de forma automática.

Para obtener más información, consulta los precios de almacenamiento.

Usa las inserciones de transmisión con cuidado

Práctica recomendada: usa las inserciones de transmisión solo si tus datos deben estar disponibles de inmediato.

Subir datos en BigQuery no tiene costo. Sin embargo, la transmisión de datos a BigQuery sí genera un costo. A menos que tus datos deban estar disponibles de inmediato, súbelos en lugar de transmitirlos.