Ottimizza una query utilizzando il visualizzatore del piano di query

Il visualizzatore del piano di query consente di comprendere rapidamente la struttura del piano di query scelto da Spanner per valutare una query. Questa guida descrive come utilizzare un piano di query per comprendere meglio l'esecuzione delle query.

Prima di iniziare

Per acquisire familiarità con le parti dell'interfaccia utente della console Google Cloud menzionate in questa guida, leggi quanto segue:

Eseguire una query nella console Google Cloud

  1. Vai alla pagina Istanze di Spanner nella console Google Cloud.

    Vai alla pagina Istanze

  2. Seleziona il nome dell'istanza contenente il database su cui eseguire la query.

    La console Google Cloud mostra la pagina Panoramica dell'istanza.

  3. Seleziona il nome del database su cui eseguire la query.

    Nella console Google Cloud viene visualizzata la pagina Panoramica del database.

  4. Nel menu laterale, fai clic su Spanner Studio.

    Nella console Google Cloud viene visualizzata la pagina Spanner Studio del database.

  5. Inserisci la query SQL nel riquadro dell'editor.
  6. Fai clic su Esegui.

    Spanner esegue la query.

  7. Fai clic sulla scheda Spiegazione per vedere la visualizzazione del piano di query.

Tour dell'editor di query

La pagina Spanner Studio contiene schede query che consentono di digitare o incollare query SQL e istruzioni DML, eseguirle sul database e visualizzare i risultati e i piani di esecuzione delle query. I componenti chiave della pagina Spanner Studio sono numerati nello screenshot seguente.

Pagina delle query con annotazioni.
Figura 7. Pagina Query con annotazioni.
  1. La barra delle schede mostra le schede delle query aperte. Per creare una nuova scheda, fai clic su Nuova scheda.

    La barra delle schede fornisce anche un elenco di modelli di query che puoi utilizzare per incollare le query che forniscono insight su query di database, transazioni, letture e altro ancora, come descritto in Panoramica degli strumenti di introspezione.

  2. La barra dei comandi dell'editor offre le seguenti opzioni:
    • Il comando Esegui esegue le istruzioni inserite nel riquadro di modifica, producendo i risultati delle query nella scheda Risultati e i piani di esecuzione delle query nella scheda Spiegazione. Modifica il comportamento predefinito utilizzando il menu a discesa per generare Solo risultati o Solo spiegazione.

      Se evidenzia un elemento nell'editor, il comando Esegui cambia in Esegui selezionato, consentendoti di eseguire solo ciò che hai selezionato.

    • Il comando Cancella query elimina tutto il testo nell'editor e cancella le sottotabelle Risultati e Spiegazione.
    • Il comando Formatta query formatta le istruzioni nell'editor in modo che siano più facili da leggere.
    • Il comando Scorciatoie mostra l'insieme di scorciatoie da tastiera che puoi utilizzare nell'editor.
    • Il link per la guida alle query SQL apre una scheda del browser che rimanda alla documentazione sulla sintassi delle query SQL.

    Le query vengono convalidate automaticamente ogni volta che vengono aggiornate nell'editor. Se le istruzioni sono valide, la barra dei comandi dell'editor mostra un segno di spunta di conferma e il messaggio Valido. In caso di problemi, viene visualizzato un messaggio di errore con i dettagli.

  3. Nell'editor inserisci la query SQL e le istruzioni DML. Sono codificati per colore e i numeri di riga vengono aggiunti automaticamente per le istruzioni multiriga.

    Se inserisci più di un'istruzione nell'editor, devi utilizzare un punto e virgola finale dopo ogni istruzione, tranne l'ultima.

  4. Il riquadro inferiore di una scheda Query presenta tre sottotabelle:
    • La scheda secondaria Schema mostra le tabelle nel database e i relativi schemi. Usala come riferimento rapido quando scrivi istruzioni nell'editor.
    • La scheda secondaria Risultati mostra i risultati quando esegui le istruzioni nell'editor. Per le query viene mostrata una tabella dei risultati, mentre per le istruzioni DML come INSERT e >UPDATE viene mostrato un messaggio sul numero di righe interessate.
    • La scheda secondaria Spiegazione mostra i grafici visivi dei piani di query creati quando esegui le istruzioni nell'editor.
  5. Le sottotabelle Risultati e Spiegazione forniscono un selettore di istruzioni che ti consente di scegliere i risultati o il piano di query dell'istruzione da visualizzare.

Visualizza piani di query campionate

    In alcuni casi, potrebbe essere utile visualizzare i piani di query campionati e confrontare le prestazioni di una query nel tempo. Per le query che consumano più CPU, Spanner conserva i piani di query campionati per 30 giorni nella pagina Approfondimenti sulle query della console Google Cloud. Per visualizzare i piani di query campionate:

  1. Vai alla pagina Istanze di Spanner nella console Google Cloud.

    Vai alla pagina Istanze

  2. Fai clic sul nome dell'istanza con le query che vuoi esaminare.

    La console Google Cloud mostra la pagina Panoramica dell'istanza.

  3. Nel menu Navigazione e sotto l'intestazione Osservabilità, fai clic su Approfondimenti sulle query.

    La console Google Cloud mostra la pagina Query Insights dell'istanza.

  4. Nel menu a discesa Database, seleziona il database con le query che vuoi esaminare.

    La console Google Cloud visualizza le informazioni sul carico delle query per il database. La tabella Query e tag TopN mostra l'elenco delle query e dei tag di richiesta principali ordinati per utilizzo della CPU.

  5. Trova la query con un elevato utilizzo della CPU per cui vuoi visualizzare i piani di query campionati. Fai clic sul valore FPRINT della query.

    La pagina Dettagli query mostra un grafico Esempi di piani di query per la query nel tempo. Puoi diminuire lo zoom fino a un massimo di sette giorni prima dell'ora attuale. Nota: i piani di query non sono supportati per le query con partitionTokens ottenute dall'API PartitionQuery e dalle query DML partizionate.

  6. Fai clic su uno dei punti nel grafico per visualizzare un piano di query precedente e i passaggi eseguiti durante l'esecuzione della query. Puoi anche fare clic su un operatore per visualizzare informazioni espanse sull'operatore.

    Grafico di esempi di piani di query.
    Figura 8. Grafico di esempi di piani di query.

Fai un tour del visualizzatore del piano di query

I componenti chiave del visualizzatore sono annotati nello screenshot seguente e descritti in modo più dettagliato. Dopo aver eseguito una query in una scheda delle query, seleziona la scheda SPIEGAZIONE sotto l'editor query per aprire il visualizzatore del piano di esecuzione delle query.

Il flusso di dati nel seguente diagramma è dal basso verso l'alto, ovvero tutte le tabelle e tutti gli indici si trovano nella parte inferiore del diagramma e l'output finale si trova in alto.

Visualizzatore del piano di query con annotazioni
Figura 9. Visualizzatore del piano di query con annotazioni.
  • La visualizzazione del piano può essere di grandi dimensioni, a seconda della query eseguita. Per nascondere e mostrare i dettagli, attiva/disattiva il selettore della vista ESPANDI/COMPACT. Puoi personalizzare la porzione del piano da visualizzare in qualsiasi momento utilizzando il controllo dello zoom.
  • L'algebra che spiega in che modo Spanner esegue la query viene disegnata come un grafo aciclico, in cui ogni nodo corrisponde a un iteratore che consuma righe dai suoi input e produce righe per l'elemento padre. Nella Figura 9 è mostrato un piano di esempio. Fai clic sul diagramma per visualizzare una vista estesa di alcuni dettagli del piano.

    Miniatura screenshot del piano visivo
    Figura 9. Piano visivo di esempio (fai clic per aumentare lo zoom).
    Screenshot ingrandito del piano visivo

    Ogni nodo, o scheda, nel grafico rappresenta un iteratore e contiene le seguenti informazioni:

    • Il nome dell'iteratore. Un iteratore consuma righe dal suo input e produce righe.
    • Statistiche di runtime che indicano quante righe sono state restituite, quale latenza è stata utilizzata e quanta CPU è stata consumata.
    • Forniamo i seguenti indicatori visivi per aiutarti a identificare potenziali problemi all'interno del piano di esecuzione delle query.
    • Le barre rosse in un nodo sono indicatori visivi della percentuale di latenza o del tempo di CPU per questo iteratore rispetto al totale della query.
    • Lo spessore delle linee che collegano ciascun nodo rappresenta il conteggio delle righe. Più spessa è la linea, maggiore è il numero di righe passate al nodo successivo. Il numero effettivo di righe viene visualizzato in ogni scheda e quando posizioni il puntatore sopra un connettore.
    • Viene visualizzato un triangolo di avviso su un nodo in cui è stata eseguita una scansione completa della tabella. Ulteriori dettagli nel riquadro delle informazioni includono suggerimenti come l'aggiunta di un indice o, se possibile, la revisione della query o dello schema in altri modi per evitare un'analisi completa.
    • Seleziona una scheda nel piano per visualizzarne i dettagli nel riquadro delle informazioni a destra (5).

  • La mini mappa del piano di esecuzione mostra una vista ridotta dello zoom dell'intero piano ed è utile per determinare la forma complessiva del piano di esecuzione e per spostarsi rapidamente tra le diverse parti del piano. Trascina direttamente sulla mini-mappa o fai clic sul punto su cui vuoi concentrarti per passare a un'altra parte del piano visivo.
  • Seleziona SCARICA JSON per scaricare una versione JSON del piano di esecuzione, che è utile quando contatti il team di Spanner per assistenza.
  • Il riquadro delle informazioni mostra informazioni contestuali dettagliate sul nodo selezionato nel diagramma del piano di query. Le informazioni sono organizzate nelle seguenti categorie.
    • Informazioni sull'iteratore fornisce dettagli e statistiche di runtime per la scheda Iterator selezionata nel grafico.
    • Riepilogo query fornisce dettagli sul numero di righe restituite e sul tempo necessario per eseguire la query. Gli operatori più visibili sono quelli che mostrano una latenza significativa, consumano una CPU significativa rispetto ad altri operatori e restituiscono un numero significativo di righe di dati.
    • Cronologia di esecuzione delle query è un grafico basato sul tempo che mostra per quanto tempo ogni gruppo di macchine ha eseguito la sua parte della query. Un gruppo di macchine potrebbe non essere necessariamente in esecuzione per l'intera durata della query. È anche possibile che un gruppo di macchine sia stato eseguito più volte nel corso dell'esecuzione della query, ma la sequenza temporale in questo caso rappresenta solo l'inizio della prima esecuzione e la fine dell'ultima.
  • Ottimizza una query con un rendimento scarso

    Immagina che la tua azienda gestisca un database di film online contenente informazioni su film quali cast, società di produzione, dettagli sui film e altro ancora. Il servizio viene eseguito su Spanner, ma di recente si sono verificati alcuni problemi di prestazioni.

    In qualità di sviluppatore principale del servizio, ti viene chiesto di esaminare questi problemi di rendimento perché causano valutazioni scadenti per il servizio. Apri la console Google Cloud, vai all'istanza del database e apri l'editor query. Inserisci la seguente query nell'editor ed eseguila.

    SELECT
      t.title,
      MIN(t.production_year) AS year,
      ANY_VALUE(mc.note HAVING MIN t.production_year) AS note
    FROM
      title AS t
    JOIN
      movie_companies AS mc
    ON
      t.id = mc.movie_id
    WHERE
      t.title LIKE '% the %'
    GROUP BY
      title;
    

    Il risultato dell'esecuzione di questa query è mostrato nello screenshot seguente. Abbiamo formattato la query nell'editor selezionando FORMATO QUERY. È presente anche una nota in alto a destra dello schermo che indica che la query è valida.

    Editor di query che mostra la query originale
    Figura 1. Editor di query che mostra la query originale.

    La scheda RISULTATI sotto l'editor di query mostra che la query è stata completata in poco più di due minuti. Decidi di esaminare più in dettaglio la query per vedere se è efficace.

    Analizza le query lente con il visualizzatore del piano di query

    A questo punto, sappiamo che la query nel passaggio precedente richiede più di due minuti, ma non sappiamo se la query è il più efficiente possibile e, quindi, se questa durata è prevista.

    Selezioni la scheda SPIEGAZIONE appena sotto l'editor di query per visualizzare una rappresentazione visiva del piano di esecuzione creato da Spanner per eseguire la query e restituire i risultati.

    Il piano mostrato nello screenshot seguente è relativamente grande ma, anche a questo livello di zoom, puoi effettuare le seguenti osservazioni.

    • In base al Riepilogo delle query nel riquadro delle informazioni a destra, abbiamo scoperto che sono state scansionate quasi 3 milioni di righe e alla fine sono state restituite meno di 64.000.

    • Possiamo anche vedere dal riquadro Cronologia di esecuzione della query che 4 gruppi di macchine sono stati coinvolti nella query. Un gruppo di macchine è responsabile dell'esecuzione di una parte della query. Gli operatori possono essere eseguiti su una o più macchine. La selezione di un gruppo di macchine nella sequenza temporale evidenzia nel piano visivo quale parte della query è stata eseguita su quel gruppo.

    Visualizzatore del piano di query che mostra la spiegazione visiva della query originale
    Figura 2. Visualizzatore del piano di query che mostra il piano visivo della query originale.

    A causa di questi fattori, decidi che potrebbe essere possibile migliorare le prestazioni modificando il join da un join apply, scelto da Spanner per impostazione predefinita, a un hash join.

    Migliora la query

    Per migliorare le prestazioni della query, puoi utilizzare un hint di join per cambiare il metodo di join in un join hash. L'implementazione del join esegue l'elaborazione basata su set.

    Ecco la query aggiornata:

    SELECT
      t.title,
      MIN(t.production_year) AS year,
      ANY_VALUE(mc.note HAVING MIN t.production_year) AS note
    FROM
      title AS t
    JOIN
      @{join_method=hash_join} movie_companies AS mc
    ON
      t.id = mc.movie_id
    WHERE
      t.title LIKE '% the %'
    GROUP BY
      title;
    

    Il seguente screenshot illustra la query aggiornata. Come mostrato nello screenshot, la query è stata completata in meno di 5 secondi, un miglioramento significativo rispetto ai 120 secondi di runtime prima di questa modifica.

    Editor di query che mostra la query migliorata
    Figura 3. Editor di query che mostra la query migliorata.

    Esamina il nuovo piano visivo, mostrato nel diagramma seguente, per capire cosa ci dice su questo miglioramento.

    Visualizzazione delle query nella UI della console Cloud
    Figura 4. Visualizzazione del piano di query dopo i miglioramenti della query (fai clic per aumentare lo zoom).

    Screenshot ingrandito del piano visivo

    Noti subito alcune differenze:

    • In questa esecuzione della query è stato coinvolto un solo gruppo di macchine.

    • Il numero di aggregazioni è stato ridotto drasticamente.

    Conclusione

    In questo scenario, abbiamo eseguito una query lenta e esaminato il suo piano visivo per individuare inefficienze. Di seguito è riportato un riepilogo delle query e dei piani prima e dopo le eventuali modifiche. Ogni scheda mostra la query eseguita e una visualizzazione compatta della visualizzazione completa del piano di esecuzione delle query.

    Prima

    SELECT
      t.title,
      MIN(t.production_year) AS year,
      ANY_VALUE(mc.note
      HAVING
        MIN t.production_year) AS note
    FROM
      title AS t
    JOIN
      movie_companies AS mc
    ON
      t.id = mc.movie_id
    WHERE
      t.title LIKE '% the %'
    GROUP BY
      title;
    
    Visualizzazione compatta del piano visivo prima dei miglioramenti.
    Figura 5. Visualizzazione compatta del piano visivo prima dei miglioramenti.

    Dopo

    SELECT
      t.title,
      MIN(t.production_year) AS year,
      ANY_VALUE(mc.note
      HAVING
        MIN t.production_year) AS note
    FROM
      title AS t
    JOIN
      @{join_method=hash_join} movie_companies AS mc
    ON
      t.id = mc.movie_id
    WHERE
      t.title LIKE '% the %'
    GROUP BY
      title;
    
    Visualizzazione compatta del piano visivo dopo i miglioramenti.
    Figura 6. Visualizzazione compatta del piano visivo dopo i miglioramenti.

    Un indicatore che potrebbe essere migliorato in questo scenario era che una grande parte delle righe nel title della tabella qualificava il filtro LIKE '% the %'. Cercare un'altra tabella con così tante righe potrebbe essere costosa. La modifica dell'implementazione dei join in un join hash ha migliorato in modo significativo le prestazioni.

    Passaggi successivi