Stima e controlla i costi

Questa pagina descrive come stimare i costi ed elenca le best practice per il controllo dei costi in BigQuery. BigQuery offre due tipi di modelli di prezzi: on demand e basati sulla capacità. Per informazioni sui prezzi, consulta la pagina relativa ai prezzi di BigQuery.

Con BigQuery puoi stimare il costo dell'esecuzione di una query, calcolare i byte elaborati da varie query e ottenere una stima dei costi mensile in base all'utilizzo previsto. Per controllare i costi, devi anche seguire le best practice per ottimizzare il calcolo delle query e l'archiviazione di BigQuery. Per le best practice specifiche per i costi, consulta Controllare i costi delle query.

Per monitorare i costi delle query e l'utilizzo di BigQuery, analizza gli audit log di BigQuery.

Stima i costi delle query

BigQuery offre vari metodi per stimare i costi:

Calcolo delle dimensioni delle query on demand

Per calcolare il numero di byte elaborati dai vari tipi di query utilizzando il modello di fatturazione on demand, consulta le seguenti sezioni:

Esegui query sui formati a colonne su Cloud Storage

Se i tuoi dati esterni sono archiviati in formato ORC o Parquet, il numero di byte addebitati è limitato alle colonne lette da BigQuery. Poiché i tipi di dati di un'origine dati esterna sono convertiti dalla query in tipi di dati BigQuery, il numero di byte letti è calcolato in base alle dimensioni dei tipi di dati BigQuery. Per informazioni sulle conversioni dei tipi di dati, consulta le seguenti pagine:

Utilizzare il Calcolatore prezzi di Google Cloud

Il Calcolatore prezzi di Google Cloud può aiutarti a creare una stima dei costi mensili complessivi per BigQuery in base all'utilizzo previsto.

On demand

Per stimare i costi nel Calcolatore prezzi di Google Cloud quando utilizzi il modello di prezzi on demand, segui questi passaggi:

  1. Apri il Calcolatore prezzi di Google Cloud.
  2. Fai clic su BigQuery.
  3. Fai clic sulla scheda On demand.
  4. In Nome tabella, digita il nome della tabella. Ad esempio, airports.
  5. In Prezzi dello spazio di archiviazione, inserisci la dimensione stimata della tabella nei campi dello spazio di archiviazione. Devi solo stimare l'archiviazione fisica o quella logica, a seconda del modello di fatturazione dell'archiviazione del set di dati.
  6. In Prezzi delle query, inserisci i byte stimati letti dalla prova o dallo strumento di convalida delle query.
  7. Fai clic su Aggiungi a stima.
  8. La stima viene visualizzata a destra. Tieni presente che puoi salvare la stima o inviarla via email.

Per ulteriori informazioni, consulta i prezzi on demand.

Versioni

Per stimare i costi nel Calcolatore prezzi di Google Cloud quando utilizzi il modello di prezzi basato sulla capacità con le versioni di BigQuery, segui questi passaggi:

  1. Apri il Calcolatore prezzi di Google Cloud.
  2. Fai clic su BigQuery.
  3. Fai clic sulla scheda Versioni.
  4. Scegli la località in cui vengono utilizzati gli slot.
  5. Scegli la tua versione.
  6. Scegli Numero massimo di slot, Slot di riferimento, Impegno facoltativo e Utilizzo stimato della scalabilità automatica.
  7. Scegli la località in cui sono archiviati i dati.
  8. Inserisci le tue stime di utilizzo dello spazio di archiviazione per Spazio di archiviazione attivo, Spazio di archiviazione a lungo termine, Inserimento di flussi di dati e Letture di flussi di dati. Devi solo stimare l'archiviazione fisica o quella logica, a seconda del modello di fatturazione dell'archiviazione del set di dati.
  9. Fai clic su Aggiungi a stima.

Per saperne di più, consulta la sezione relativa ai prezzi basati sulla capacità.

Controlla i costi delle query

Per ottimizzare i costi delle query, assicurati di disporre di archiviazione ottimizzata e calcolo delle query. Per ulteriori metodi per controllare il costo delle query, consulta le seguenti sezioni:

Controlla il costo delle query prima di eseguirle

Best practice:prima di eseguire le query, visualizza l'anteprima per stimare i costi.

Le query vengono fatturate in base al numero di byte letti. Per stimare i costi prima di eseguire una query:

Utilizzare lo strumento di convalida delle query

Quando inserisci una query nella console Google Cloud, lo strumento di convalida delle query verifica la sintassi delle query e fornisce una stima del numero di byte letti. Puoi utilizzare questa stima per calcolare il costo delle query nel Calcolatore prezzi.

  • Se la query non è valida, lo strumento di convalida delle query mostra un messaggio di errore. Ad esempio:

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

  • Se la query è valida, lo strumento di convalida delle query fornisce una stima del numero di byte necessari per elaborare la query. Ad esempio:

    This query will process 623.1 KiB when run.

Esegui una prova

Per eseguire una prova, segui questi passaggi:

Console

  1. Vai alla pagina di BigQuery.

    Vai a BigQuery

  2. Inserisci la query nell'Editor query.

    Se la query è valida, viene visualizzato automaticamente un segno di spunta insieme alla quantità di dati che verrà elaborata dalla query. Se la query non è valida, viene visualizzato un punto esclamativo insieme a un messaggio di errore.

bq

Inserisci una query come la seguente utilizzando il flag --dry_run.

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

Per una query valida, il comando produce la seguente risposta:

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

API

Per eseguire una prova utilizzando l'API, invia un job di query con dryRun impostato su true nel tipo JobConfiguration.

Go

Prima di provare questo esempio, segui le istruzioni di configurazione di Go disponibili nella guida rapida di BigQuery sull'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API BigQuery Go.

Per eseguire l'autenticazione in BigQuery, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Prima di provare questo esempio, segui le istruzioni di configurazione di Java disponibili nella guida rapida di BigQuery sull'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API BigQuery Java.

Per eseguire l'autenticazione in BigQuery, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Prima di provare questo esempio, segui le istruzioni di configurazione di Node.js disponibili nella guida rapida di BigQuery sull'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API BigQuery Node.js.

Per eseguire l'autenticazione in BigQuery, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

// 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

Prima di provare questo esempio, segui le istruzioni di configurazione di PHP disponibili nella guida rapida di BigQuery sull'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API BigQuery PHP.

Per eseguire l'autenticazione in BigQuery, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Imposta la proprietà QueryJobConfig.dry_run su True. Client.query() restituisce sempre un QueryJob completato quando viene fornita una configurazione di query di prova.

Prima di provare questo esempio, segui le istruzioni di configurazione di Python disponibili nella guida rapida di BigQuery sull'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API BigQuery Python.

Per eseguire l'autenticazione in BigQuery, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Evita di eseguire query per esplorare i dati della tabella

Best practice:non eseguire query per esplorare o visualizzare l'anteprima dei dati della tabella.

Se stai sperimentando o esplori i dati, puoi utilizzare le opzioni di anteprima della tabella per visualizzarli gratuitamente e senza influire sulle quote.

BigQuery supporta le seguenti opzioni di anteprima dei dati:

  • Nella pagina dei dettagli della tabella della console Google Cloud, fai clic sulla scheda Anteprima per campionare i dati.
  • Nello strumento a riga di comando bq, utilizza il comando bq head e specifica il numero di righe da visualizzare in anteprima.
  • Nell'API, utilizza tabledata.list per recuperare i dati della tabella da un insieme specificato di righe.

Limita il numero di byte fatturati

Best practice: utilizza l'impostazione relativa al numero massimo di byte fatturati per limitare i costi delle query.

Puoi limitare il numero di byte fatturati per una query utilizzando l'impostazione relativa al numero massimo di byte fatturati. Quando imposti il numero massimo di byte fatturati, il numero di byte letti dalla query viene stimato prima dell'esecuzione della query. Se il numero di byte stimati supera il limite, la query non va a buon fine senza essere addebitato.

Per le tabelle in cluster, la stima del numero di byte fatturati per una query corrisponde a un limite superiore e può essere superiore al numero effettivo di byte fatturati dopo l'esecuzione della query. Quindi, in alcuni casi, se imposti il numero massimo di byte fatturati, una query su una tabella in cluster potrebbe non riuscire, anche se i byte effettivi fatturati non supereranno il numero massimo di byte fatturati.

Se una query non riesce a causa dell'impostazione del numero massimo di byte fatturati, viene restituito un errore simile al seguente:

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

Per impostare il numero massimo di byte fatturati:

Console

  1. Nell'Editor query, fai clic su Altro > Impostazioni query > Opzioni avanzate.
  2. Nel campo Numero massimo di byte fatturati, inserisci un numero intero.
  3. Fai clic su Salva.

bq

Utilizza il comando bq query con il flag --maximum_bytes_billed.

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

API

Imposta la proprietà maximumBytesBilled in JobConfigurationQuery o QueryRequest.

Evita di utilizzare LIMIT nelle tabelle non in cluster

Best practice: per le tabelle non in cluster, non utilizzare una clausola LIMIT come metodo di controllo dei costi.

Per le tabelle non in cluster, l'applicazione di una clausola LIMIT a una query non influisce sulla quantità di dati letti. Ti viene addebitata la lettura di tutti i byte nell'intera tabella come indicato dalla query, anche se la query restituisce solo un sottoinsieme. Con una tabella in cluster, una clausola LIMIT può ridurre il numero di byte analizzati, perché l'analisi si interrompe quando viene analizzato un numero sufficiente di blocchi per ottenere il risultato. Ti vengono addebitati solo i byte analizzati.

Visualizza i costi utilizzando una dashboard ed esegui query sugli audit log

Best practice: crea una dashboard per visualizzare i dati di fatturazione in modo da poter apportare modifiche all'utilizzo di BigQuery. Valuta anche la possibilità di trasmettere flussi di audit log a BigQuery in modo da poter analizzare i pattern di utilizzo.

Puoi esportare i dati di fatturazione in BigQuery e visualizzarli in uno strumento come Looker Studio. Per un tutorial sulla creazione di una dashboard di fatturazione, consulta Visualizzare la fatturazione di Google Cloud utilizzando BigQuery e Looker Studio.

Puoi inoltre trasmettere in streaming i tuoi audit log a BigQuery e analizzarli per cercare pattern di utilizzo, ad esempio i costi delle query per utente.

Materializza i risultati della query in fasi

Best practice:se possibile, materializza i risultati della query in più fasi.

Se crei una query multifase di grandi dimensioni, ogni volta che la esegui, BigQuery legge tutti i dati richiesti dalla query. Ti vengono addebitati tutti i dati letti ogni volta che viene eseguita la query.

Suddividi invece la query in più fasi in cui ogni fase materializza i risultati scrivendoli in una tabella di destinazione. L'esecuzione di query sulla tabella di destinazione più piccola riduce la quantità di dati letti e riduce i costi. Il costo dell'archiviazione dei risultati materializzati è molto inferiore a quello dell'elaborazione di grandi quantità di dati.

Utilizza la scadenza della tabella per le tabelle di destinazione

Best practice: se stai scrivendo risultati di query di grandi dimensioni in una tabella di destinazione, utilizza la scadenza predefinita della tabella per rimuovere i dati quando non sono più necessari.

Mantenere set di risultati di grandi dimensioni nello spazio di archiviazione di BigQuery ha un costo. Se non hai bisogno dell'accesso permanente ai risultati, utilizza la scadenza predefinita della tabella per eliminare automaticamente i dati.

Per ulteriori informazioni, vedi i prezzi dello spazio di archiviazione.

Passaggi successivi