Introduzione all'ottimizzazione delle prestazioni delle query
Questo documento fornisce una panoramica delle tecniche di ottimizzazione che possono migliorare le prestazioni delle query in BigQuery. In generale, le query che richiedono meno lavoro hanno prestazioni migliori. Vengono eseguiti più velocemente e consumano meno risorse, il che può comportare costi inferiori e meno errori.
Prestazioni delle query
La valutazione delle prestazioni delle query in BigQuery dipende da diversi fattori:
- Dati di input e origini dati (I/O): quanti byte vengono letti dalla query?
- Comunicazione tra nodi (shuffling): quanti byte vengono passati dalla query alla fase successiva? Quanti byte passa la query a ogni slot?
- Calcolo: quanta CPU richiede la query?
- Output (materializzazione): quanti byte vengono scritti dalla query?
- Capacità e concorrenza: Quanti slot sono disponibili e quante altre query sono in esecuzione contemporaneamente?
- Pattern di query: le query seguono le best practice relative a SQL?
Per valutare query specifiche o se si verifica una contesa di risorse, puoi utilizzare Cloud Monitoring o i grafici delle risorse amministrative BigQuery per monitorare il modo in cui i job BigQuery consumano risorse nel tempo. Se identifichi una query lenta o che richiede molte risorse, puoi concentrare le ottimizzazioni delle prestazioni su quella query.
Alcuni pattern di query, in particolare quelli generati dagli strumenti di business intelligence, possono essere accelerati utilizzando BigQuery BI Engine. BI Engine è un servizio di analisi in memoria rapido che accelera molte query SQL in BigQuery memorizzando in modo intelligente nella cache i dati che utilizzi più spesso. BI Engine è integrato in BigQuery, il che significa che spesso puoi ottenere prestazioni migliori senza modifiche alle query.
Come per qualsiasi sistema, l'ottimizzazione delle prestazioni a volte comporta dei compromessi. Ad esempio, l'utilizzo di una sintassi SQL avanzata a volte può introdurre complessità e ridurre la comprensibilità delle query per le persone che non sono esperte di SQL. Dedicare tempo alle micro-ottimizzazioni per i carichi di lavoro non critici potrebbe anche distogliere le risorse dalla creazione di nuove funzionalità per le tue applicazioni o dall'identificazione di ottimizzazioni più importanti. Per aiutarti a ottenere il massimo ritorno sull'investimento, ti consigliamo di concentrare le ottimizzazioni sui workload più importanti per le tue pipeline di analisi dei dati.
Ottimizzazione per capacità e concorrenza
BigQuery offre due modelli di prezzo per le query: prezzi on demand e prezzi basati sulla capacità. Il modello on demand fornisce un pool condiviso di capacità e i prezzi si basano sulla quantità di dati elaborati da ogni query eseguita.
Il modello basato sulla capacità è consigliato se vuoi pianificare una spesa mensile costante o se hai bisogno di una capacità maggiore di quella disponibile con il modello on demand. Quando utilizzi i prezzi basati sulla capacità, allochi una capacità di elaborazione delle query dedicata misurata in slot. Il costo di tutti i byte elaborati è incluso nel prezzo basato sulla capacità. Oltre agli impegni per gli slot fissi, puoi utilizzare gli slot con scalabilità automatica, che forniscono capacità dinamica in base al carico di lavoro delle query.
Le prestazioni delle query eseguite ripetutamente sugli stessi dati possono variare e la variazione è generalmente maggiore per le query che utilizzano slot on demand rispetto a quelle che utilizzano prenotazioni di slot.
Durante l'elaborazione delle query SQL, BigQuery suddivide la capacità di calcolo richiesta per eseguire ogni fase di una query in slot. BigQuery determina automaticamente il numero di query che possono essere eseguite contemporaneamente nel seguente modo:
- Modello on demand: numero di slot disponibili nel progetto
- Modello basato sulla capacità: numero di slot disponibili nella prenotazione
Le query che richiedono più slot di quelli disponibili vengono messe in coda finché non diventano disponibili risorse di elaborazione. Dopo l'inizio dell'esecuzione di una query, BigQuery calcola quanti slot utilizza ogni fase della query in base alle dimensioni e alla complessità della fase e al numero di slot disponibili. BigQuery utilizza una tecnica chiamata pianificazione equa per garantire che ogni query abbia capacità sufficiente per progredire.
L'accesso a più slot non sempre comporta prestazioni più rapide per una query. Tuttavia, un pool di slot più grande può migliorare le prestazioni di query grandi o complesse e di carichi di lavoro ad alta contemporaneità. Per migliorare il rendimento delle query, puoi modificare le prenotazioni di slot o impostare un limite più alto per la scalabilità automatica degli slot.
Piano di query e cronologia
BigQuery genera un piano di query ogni volta che esegui una query. Comprendere questo piano è fondamentale per un'ottimizzazione efficace delle query. Il piano di query include statistiche di esecuzione come i byte letti e il tempo di slot utilizzato. Il piano di query include anche dettagli sulle diverse fasi di esecuzione, che possono aiutarti a diagnosticare e migliorare le prestazioni delle query. Il grafico di esecuzione delle query fornisce un'interfaccia grafica per visualizzare il piano di query e diagnosticare i problemi di prestazioni delle query.
Puoi anche utilizzare il metodo API jobs.get
o la visualizzazione INFORMATION_SCHEMA.JOBS
per recuperare le informazioni sul piano di query e sulla sequenza temporale. Queste informazioni vengono utilizzate da
BigQuery Visualizer,
uno strumento open source che rappresenta visivamente il flusso delle fasi di esecuzione in un
job BigQuery.
Quando BigQuery esegue un job di query, converte l'istruzione SQL dichiarativa in un grafico di esecuzione. Questo grafico è suddiviso in una serie di fasi della query, a loro volta composte da insiemi più granulari di passaggi di esecuzione. BigQuery utilizza un'architettura parallela altamente distribuita per eseguire queste query. Le fasi di BigQuery modellano le unità di lavoro che molti potenziali worker potrebbero eseguire in parallelo. Le fasi comunicano tra loro tramite un'architettura di rimescolamento distribuita e veloce.
Oltre al piano di query, i job di query espongono anche una sequenza temporale di esecuzione. Questa sequenza temporale fornisce un conteggio delle unità di lavoro completate, in attesa e attive all'interno dei worker di query. Una query potrebbe avere più fasi con worker attivi contemporaneamente, quindi la sequenza temporale ha lo scopo di mostrare l'avanzamento complessivo della query.
Per stimare il costo di calcolo di una query, puoi esaminare il numero totale di secondi di slot consumati dalla query. Minore è il numero di secondi di slot, meglio è, perché significa che sono disponibili più risorse per altre query eseguite nello stesso progetto contemporaneamente.
Il piano di query e le statistiche della sequenza temporale possono aiutarti a capire come BigQuery esegue le query e se determinate fasi dominano l'utilizzo delle risorse. Ad esempio, una fase JOIN che genera molte più righe di output rispetto alle righe di input potrebbe indicare l'opportunità di filtrare prima nella query.
Tuttavia, la natura gestita del servizio limita la possibilità di intervenire direttamente su alcuni dettagli. Per best practice e tecniche per migliorare l'esecuzione e il rendimento delle query, consulta Ottimizzare il calcolo delle query.
Passaggi successivi
- Scopri come risolvere i problemi di esecuzione delle query utilizzando i log di controllo di BigQuery.
- Scopri altre tecniche di controllo dei costi per BigQuery.
- Visualizza i metadati quasi in tempo reale sui job BigQuery utilizzando la vista
INFORMATION_SHEMA.JOBS. - Scopri come monitorare l'utilizzo di BigQuery utilizzando i report delle tabelle di sistema BigQuery.