Ottimizzare 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 aiutarti a comprendere 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 in nella console Google Cloud.

    Vai alla pagina Istanze

  2. Seleziona il nome dell'istanza contenente il database da query.

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

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

    La console Google Cloud mostra 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.

Un tour dell'editor di query

La pagina Spanner Studio offre schede delle query che ti 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 La pagina di Spanner Studio è numerata nello screenshot seguente.

Pagina di query annotata.
Figura 7. Pagina Query annotata.
  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 query che forniscono informazioni su query, transazioni, letture e altro ancora del database, come descritto in Panoramica degli strumenti di ispezione.

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

      Se evidenzi un elemento nell'editor, il comando Esegui diventa Esegui selezione, 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 il set di tasti di scelta scorciatoie che puoi utilizzare nell'editor.
    • Il link per la guida alle query SQL apre una scheda del browser per 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 visualizza un segno di spunta di conferma e il messaggio Valido. Se se ci sono problemi, viene visualizzato un messaggio di errore con i dettagli.

  3. Nell'editor puoi inserire la query SQL e le istruzioni DML. Sono codificati a colori e i numeri di riga vengono aggiunti automaticamente per le istruzioni multiriga.

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

  4. Il riquadro in basso di una scheda di query contiene tre sottoschede:
    • La sottoscheda Schema mostra le tabelle nel database e i relativi schemi. Utilizzala come riferimento rapido quando componi le istruzioni nell'editor.
    • La scheda secondaria Risultati mostra i risultati quando esegui la istruzioni nell'editor. Per le query mostra una tabella dei risultati per istruzioni DML come INSERT e >UPDATE viene visualizzato un messaggio che indica il numero di righe interessate.
    • La scheda secondaria Spiegazione mostra grafici visivi della query i piani creati quando esegui le istruzioni nell'editor.
  5. Le sottotabelle Risultati e Spiegazione forniscono entrambe una selettore di istruzioni da utilizzare per scegliere i risultati o le al piano di query che vuoi visualizzare.

Visualizza piani di query campionate

    In alcuni casi, potresti voler visualizzare piani di query campionati e confrontare il rendimento di una query nel tempo. Per le query che consumano più CPU, Spanner conserva i piani di query campionate per 30 giorni su Pagina Approfondimenti sulle query di la console Google Cloud. Per visualizzare i piani di query campionate:

  1. Vai alla pagina Istanze di Spanner in 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, fai clic su Approfondimenti sulle query sotto l'intestazione Osservabilità.

    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 mostra le informazioni sul carico delle query per per configurare un database. La tabella Query e tag TopN mostra l'elenco dei principali tag di query e richiesta ordinati in base all'utilizzo della CPU.

  5. Trova la query con un elevato utilizzo della CPU che vuoi visualizzare con 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 corrente. Nota: i piani di query non sono supportati per le query con PartitionToken ottenuti dall'API PartitionQuery e Query DML partizionate.

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

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

Fai un tour del visualizzatore del piano di query

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

Il flusso di dati nel diagramma seguente è dal basso verso l'alto, cioè tutte le le tabelle e gli indici si trovano in fondo al diagramma e all'output finale è in alto.

Visualizzatore del piano di query con annotazioni
Figura 9. Visualizzatore del piano di query annotato.
  • La visualizzazione del piano può essere di grandi dimensioni, a seconda della query che hai eseguito. Per nascondere e mostrare i dettagli, attiva/disattiva il selettore di visualizzazione COMPACTA/COMPLETA. Puoi personalizzare la quantità al piano che vedi in qualsiasi momento usando il controllo dello zoom.
  • L'algebra che spiega come Spanner esegue la query è disegnata come un grafo aciclico, in cui ogni nodo corrisponde a un iteratore che consuma righe dai suoi input e produce righe per il relativo elemento principale. R è mostrato nella Figura 9. Fai clic sul diagramma per visualizzare una visualizzazione espansa di alcuni dettagli del piano.

    Miniatura dello 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 del grafico rappresenta un iteratore e contiene le seguenti informazioni:

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

  • La mini mappa del piano di esecuzione mostra una visualizzazione a livello ridotto del piano completo ed è utile per determinare la forma complessiva del piano di esecuzione e per accedere rapidamente a diverse parti del piano. Trascina direttamente sulla mini-mappa o fai clic sul punto che vuoi mettere a fuoco per passare a un'altra parte del piano visivo.
  • Seleziona SCARICA JSON per scaricare una versione JSON del piano di esecuzione, 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.
    • Le informazioni sull'iteratore forniscono dettagli e statistiche di runtime per la scheda dell'iteratore selezionata nel grafico.
    • Riepilogo query fornisce dettagli sul numero di righe e il tempo necessario per eseguire la query. Gli operatori in evidenza sono quelli che presentano una latenza significativa, consumano una quantità significativa di CPU rispetto ad altri operatori e restituiscono un numero significativo di righe di dati.
    • La cronologia di esecuzione delle query è un grafico basato sul tempo che mostra il tempo impiegato da ciascun gruppo di macchine per eseguire la propria parte della query. Un gruppo di macchine potrebbe non essere necessariamente in esecuzione per l'intera durata del tempo di esecuzione della query. È anche possibile che un gruppo di macchine sia stato eseguito più volte durante l'esecuzione della query, ma la sequenza temporale qui rappresenta solo l'inizio della prima esecuzione e la fine dell'ultima esecuzione.
  • Ottimizzare una query con prestazioni scadenti

    Immagina che la tua azienda gestisca un database di film online contenente informazioni su film come cast, case di produzione, dettagli dei film e altro ancora. Il servizio viene eseguito su Spanner, ma di recente ha riscontrato alcuni problemi di prestazioni.

    In qualità di sviluppatore principale del servizio, ti viene chiesto di esaminare questi problemi di prestazioni perché stanno causando valutazioni negative per il servizio. Tu 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. Me ha formattato la query nell'editor selezionando FORMATTA QUERY. Nella parte in alto a destra dello schermo è presente anche una nota 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 la query sia efficiente.

    Analizzare 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 è il più efficiente possibile e, pertanto, se questa durata è prevista.

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

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

    • In base al riepilogo della query nel riquadro delle informazioni a destra, scopriamo che sono state analizzate quasi 3 milioni di righe e che ne sono state restituite meno di 64.000.

    • Dal riquadro Cronologia di esecuzione della query possiamo anche vedere che 4 macchine sono stati coinvolti nella query. Un gruppo di macchine è responsabile di una parte della query. L'esecuzione degli operatori può avvenire su una o più macchine. La selezione di un gruppo di macchine nella sequenza temporale evidenzia nel piano di visualizzazione la parte della query 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.

    Per questi motivi, decidi che potrebbe essere possibile migliorare il rendimento cambiando il join da un join di applicazione, scelto da Spanner per impostazione predefinita, a un join hash.

    Migliora la query

    Per migliorare le prestazioni della query, puoi utilizzare un hint di join per modificare il join a un join hash. Questa implementazione di join esegue in base al set e l'elaborazione dei dati.

    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;
    

    Lo screenshot seguente mostra la query aggiornata. Come mostrato in screenshot, la query è stata completata in meno di cinque secondi, un numero di miglioramento del runtime rispetto ai 120 secondi di runtime prima di questa modifica.

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

    Esamina il nuovo piano visivo, mostrato nel diagramma seguente, per capire ci parla di questo miglioramento.

    Visualizzazione delle query nell'interfaccia utente della console Cloud
    Figura 4. Visualizzazione del piano di query dopo i miglioramenti delle query (Fai clic per aumentare lo zoom).

    Screenshot del piano visivo con zoom aumentato

    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 abbiamo esaminato il suo piano visivo per cercare inefficienze. Di seguito è riportato un riepilogo delle query e dei piani prima e dopo l'applicazione di eventuali modifiche. Ogni scheda mostra la query eseguita e una visualizzazione compatta del piano di esecuzione della query completo.

    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. Vista compatta del piano visivo dopo i miglioramenti.

    Un indicatore che qualcosa potrebbe essere migliorato in questo scenario è che una gran parte delle righe della tabella title ha soddisfatto il filtro LIKE '% the %'. La ricerca in un'altra tabella con così tante righe è probabile che sia costosa. La modifica dell'implementazione dei join in un join hash è stata migliorata le prestazioni in modo significativo.

    Passaggi successivi