Stima e controllo dei costi

Questa pagina descrive le best practice per stimare e controllare i costi in BigQuery.

I costi principali di BigQuery sono l'elaborazione, utilizzata per l'elaborazione delle query, e lo spazio di archiviazione per i dati caricati in BigQuery. BigQuery offre due tipi di modelli di prezzi per l'elaborazione delle query: on demand e in base alla capacità. Ogni modello offre best practice diverse per il controllo dei costi. Per i dati archiviati in BigQuery, i costi dipendono dal modello di fatturazione dello spazio di archiviazione configurato per ogni set di dati.

Controllare i costi delle query

Per controllare i costi delle singole query, ti consigliamo innanzitutto di seguire le best practice per ottimizzare il calcolo delle query e ottimizzare lo spazio di archiviazione.

Le sezioni seguenti descrivono ulteriori best practice che puoi utilizzare per controllare ulteriormente i costi delle query.

Controlla il costo stimato prima di eseguire una query

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

Quando utilizzi il modello di determinazione dei prezzi on demand, 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, il validatore delle query verifica la sintassi della 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 visualizza 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 fornisce una stima del numero di byte necessari per elaborarla. Ad esempio:

    This query will process 623.1 KiB when run.

Esegui una prova

Per eseguire una simulazione:

Console

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Inserisci la query nell'editor delle query.

    Se la query è valida, viene visualizzato automaticamente un segno di spunta insieme alla quantità di dati che verranno elaborati dalla query. Se la query non è valida, viene visualizzato un punto esclamativo con 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.

Vai

Prima di provare questo esempio, segui le istruzioni di configurazione Go riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Go.

Per autenticarti in BigQuery, configura le credenziali predefinite dell'applicazione. Per saperne di più, 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 Java riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Java.

Per autenticarti in BigQuery, configura le credenziali predefinite dell'applicazione. Per saperne di più, 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 Node.js riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Node.js.

Per autenticarti in BigQuery, configura le credenziali predefinite dell'applicazione. Per saperne di più, 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 PHP riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery PHP.

Per autenticarti in BigQuery, configura le credenziali predefinite dell'applicazione. Per saperne di più, 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 se viene fornita una configurazione di query di prova.

Prima di provare questo esempio, segui le istruzioni di configurazione Python riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Python.

Per autenticarti in BigQuery, configura le credenziali predefinite dell'applicazione. Per saperne di più, 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))

Stima dei costi delle query

Quando utilizzi il modello di determinazione dei prezzi on demand, puoi stimare il costo di esecuzione di una query calcolando il numero di byte elaborati.

Calcolo delle dimensioni delle query on demand

Per calcolare il numero di byte elaborati dai vari tipi di query, consulta le seguenti sezioni:

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 conducendo esperimenti o esplorando i tuoi dati, puoi utilizzare le opzioni di anteprima della tabella per visualizzare i dati senza costi e senza influire sulle quote.

BigQuery supporta le seguenti opzioni di anteprima dei dati:

  • Nella console Google Cloud, nella pagina dei dettagli della tabella, 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.
  • Evita di utilizzare LIMIT nelle tabelle non cluster. Per le tabelle non clusterizzate, una clausola LIMIT non riduce i costi di calcolo.

Limita il numero di byte fatturati per query

Best practice:utilizza l'impostazione dei byte massimi fatturati per limitare i costi delle query quando utilizzi il modello di prezzo on demand.

Puoi limitare il numero di byte fatturati per una query utilizzando l'impostazione dei byte massimi fatturati. Quando imposti il numero massimo di byte fatturati, il numero di byte letti dalla query viene stimato prima dell'esecuzione. Se il numero di byte stimati supera il limite, la query non riesce senza comportare addebiti.

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

Se una query non va a buon fine 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 di 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 cluster

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

Per le tabelle non cluster, l'applicazione di una clausola LIMIT a una query non influisce sulla quantità di dati letti. Ti viene addebitato il costo della lettura di tutti i byte dell'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 esaminati, perché la scansione si interrompe quando vengono analizzati blocchi sufficienti per ottenere il risultato. Ti vengono addebitati solo i byte sottoposti a scansione.

Materializzare i risultati delle query in fasi

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

Se crei una query di grandi dimensioni in più fasi, ogni volta che la esegui, BigQuery legge tutti i dati richiesti dalla query. Ti viene addebitato il costo di tutti i dati letti ogni volta che viene eseguita la query.

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

Controllare i costi del workload

Questa sezione descrive le best practice per il controllo dei costi all'interno di un workload. Un carico di lavoro è un insieme di query correlate. Ad esempio, un carico di lavoro può essere una pipeline di trasformazione dei dati eseguita quotidianamente, un insieme di dashboard gestite da un gruppo di analisti aziendali o diverse query ad hoc eseguite da un insieme di data scientist.

Utilizza il Google Cloud Calcolatore prezzi

Best practice:utilizza il Google Cloud Calcolatore prezzi per creare una stima mensile complessiva dei costi di BigQuery in base all'utilizzo previsto. Puoi quindi confrontare questa stima con i costi effettivi per identificare le aree di ottimizzazione.

On demand

Per stimare i costi nel Google Cloud Calcolatore prezzi quando utilizzi il modello di prezzo on demand:

  1. Apri il Calcolatore prezzi diGoogle Cloud .
  2. Fai clic su Aggiungi al preventivo.
  3. Seleziona BigQuery.
  4. Seleziona "On demand" per Tipo di servizio.
  5. Scegli la località in cui verranno eseguite le query.
  6. In Quantità di dati sottoposti a query, inserisci i byte stimati letti dal dry run o dallo strumento di convalida delle query.
  7. Inserisci le stime dell'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 stimare solo lo spazio di archiviazione fisico o logico, a seconda del modello di fatturazione dello spazio di archiviazione del set di dati.
  8. La stima viene visualizzata nel riquadro Dettagli costi. Per ulteriori informazioni sul costo stimato, fai clic su Apri visualizzazione dettagliata. Puoi anche scaricare e condividere la stima dei costi.

Per ulteriori informazioni, consulta Prezzi on demand.

Edizioni

Per stimare i costi nel Google Cloud Calcolatore prezzi quando utilizzi il modello di determinazione dei prezzi basato sulla capacità con le versioni di BigQuery:

  1. Apri il Calcolatore prezzi diGoogle Cloud .
  2. Fai clic su Aggiungi al preventivo.
  3. Seleziona BigQuery.
  4. Seleziona "Versioni" per Tipo di servizio.
  5. Scegli la posizione in cui vengono utilizzati gli slot.
  6. Scegli la tua Edizione.
  7. Scegli Slot massimi, Slot di riferimento, Impegno facoltativo e Utilizzo stimato della scalabilità automatica.
  8. Scegli la posizione in cui sono archiviati i dati.
  9. Inserisci le stime dell'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 stimare solo lo spazio di archiviazione fisico o logico, a seconda del modello di fatturazione dello spazio di archiviazione del set di dati.
  10. La stima viene visualizzata nel riquadro Dettagli costi. Per ulteriori informazioni sul costo stimato, fai clic su Apri visualizzazione dettagliata. Puoi anche scaricare e condividere la stima dei costi.

Per ulteriori informazioni, consulta la sezione Prezzi basati sulla capacità.

Utilizzare prenotazioni e impegni

Best practice:utilizza le prenotazioni e gli impegni di BigQuery per controllare i costi.

Quando utilizzi il modello di fatturazione on demand, l'unico modo per limitare i costi è configurare le quote giornaliere a livello di progetto o di utente. Tuttavia, queste quote applicano un limite massimo che impedisce agli utenti di eseguire query oltre il limite di quota.

Con le prenotazioni di slot, specifichi il numero massimo di slot disponibili per carichi di lavoro specifici. Puoi anche acquistare impegni di slot che offrono prezzi scontati per un determinato periodo di tempo. Per ulteriori informazioni, consulta la sezione Introduzione alle prenotazioni BigQuery.

Utilizzare lo stimatore di slot

Best practice:utilizza lo strumento per la stima degli slot per stimare il numero di slot necessari per i tuoi carichi di lavoro.

Lo strumento di stima degli slot BigQuery ti aiuta a gestire la capacità degli slot in base alle metriche relative alle prestazioni storiche.

Inoltre, i clienti che utilizzano il modello di prezzo on demand possono visualizzare consigli per le dimensioni per gli impegni e le prenotazioni con scalabilità automatica con prestazioni simili quando passano al prezzo in base alla capacità.

Visualizzare i costi utilizzando una dashboard

Best practice:crea una dashboard per analizzare i dati di fatturazione Cloud in modo da monitorare e modificare l'utilizzo di BigQuery.

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 Google Cloud la fatturazione utilizzando BigQuery e Looker Studio.

Utilizzare budget e avvisi di fatturazione

Best practice:utilizza i budget di fatturazione Cloud per monitorare gli addebiti di BigQuery in un unico posto.

I budget di fatturazione di Cloud ti consentono di monitorare i costi effettivi rispetto a quelli pianificati. Dopo aver impostato un importo del budget, definisci delle regole di soglia di avviso per il budget, in modo che attivino le notifiche email. Le email di avviso sul budget ti aiutano a rimanere al corrente sull'andamento della spesa di BigQuery rispetto al budget.

Creare quote di query personalizzate

Best practice:utilizza le quote giornaliere delle query personalizzate per limitare la quantità di dati elaborati ogni giorno.

Puoi gestire i costi impostando una quota personalizzata che specifica un limite per la quantità di dati elaborati al giorno per progetto o per utente. Gli utenti non possono eseguire query una volta raggiunta la quota.

Controllare i costi di archiviazione

Utilizza queste best practice per ottimizzare il costo dello spazio di archiviazione BigQuery. Puoi anche ottimizzare lo spazio di archiviazione per le prestazioni delle query.

Utilizzare lo spazio di archiviazione a lungo termine

Best practice: utilizza i prezzi di archiviazione a lungo termine per ridurre il costo dei dati meno recenti.

Quando carichi i dati nello spazio di archiviazione BigQuery, questi sono soggetti ai prezzi di archiviazione di BigQuery. Per i dati precedenti, puoi usufruire automaticamente dei prezzi di archiviazione a lungo termine di BigQuery.

Se una tabella non viene modificata per 90 giorni consecutivi, il relativo prezzo di archiviazione si riduce automaticamente del 50%. Se hai una tabella partizionata, ogni partizione viene considerata separatamente per l'idoneità ai prezzi a lungo termine, in base alle stesse regole delle tabelle non partizionate.

Configura il modello di fatturazione dello spazio di archiviazione

Best practice:ottimizza il modello di fatturazione dello spazio di archiviazione in base ai tuoi modelli di utilizzo.

BigQuery supporta la fatturazione dello spazio di archiviazione utilizzando byte logici (non compressi) o fisici (compressi) o una combinazione di entrambi. Il modello di fatturazione dello spazio di archiviazione configurato per ogni set di dati determina i prezzi dello spazio di archiviazione, ma non incide sul rendimento delle query.

Puoi utilizzare le visualizzazioni INFORMATION_SCHEMA per determinare il modello di fatturazione dello spazio di archiviazione più adatto in base ai tuoi pattern di utilizzo.

Evita di sovrascrivere le tabelle

Best practice:quando utilizzi il modello di fatturazione dello spazio di archiviazione fisico, evita di sovrascrivere ripetutamente le tabelle.

Quando sovrascrivi una tabella, ad esempio utilizzando il parametro --replace nei job di caricamento batch o l'istruzione SQL TRUNCATE TABLE, i dati sostituiti vengono conservati per la durata delle finestre di viaggio nel tempo e di failsafe. Se sovrascrivi spesso una tabella, ti verranno addebitati costi di archiviazione aggiuntivi.

In alternativa, puoi caricare i dati in modo incrementale in una tabella utilizzando il parametro WRITE_APPEND nei job di caricamento, l'istruzione SQL MERGE o l'API di scrittura dello spazio di archiviazione.

Ridurre la finestra di spostamento nel tempo

Best practice:in base ai tuoi requisiti, puoi ridurre la finestra di viaggio nel tempo.

La riduzione della finestra di viaggio nel tempo dal valore predefinito di sette giorni riduce il periodo di conservazione dei dati eliminati o modificati in una tabella. Ti viene addebitato lo spazio di archiviazione di Time-Travel solo se utilizzi il modello di fatturazione dello spazio di archiviazione fisico (compresso).

La finestra di spostamento nel tempo viene impostata a livello di set di dati. Puoi anche impostare la finestra di spostamento temporale predefinita per i nuovi set di dati utilizzando le configurazioni predefinite.

Utilizzare la scadenza della tabella per le tabelle di destinazione

Best practice:se scrivi risultati di query di grandi dimensioni in una tabella di destinazione, utilizza la data e l'ora di scadenza predefinite 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 di accedere in modo permanente ai risultati, utilizza la scadenza predefinita della tabella per eliminare automaticamente i dati.

Archiviare i dati in Cloud Storage

Best practice:valuta la possibilità di archiviare i dati in Cloud Storage.

Puoi spostare i dati da BigQuery a Cloud Storage in base alle esigenze aziendali di archiviazione. Come best practice, valuta i prezzi per l'archiviazione a lungo termine e il modello di fatturazione per l'archiviazione fisica prima di esportare i dati da BigQuery.

Passaggi successivi