Risolvere i problemi relativi alle regressioni delle prestazioni

Quando usi query SQL per cercare dati, Spanner utilizza automaticamente qualsiasi indici secondari che probabilmente consentono di recuperare i dati in modo più efficiente. In alcuni casi, però, Spanner potrebbe scegliere un indice rallentando le query. Di conseguenza, potresti notare che l'esecuzione delle query è più lenta rispetto al passato.

Questa pagina spiega come rilevare cambiamenti nella velocità di esecuzione delle query. ispeziona per quelle query; e specificare un indice diverso da usare query, se necessario.

Rileva le modifiche nella velocità di esecuzione delle query

È più probabile che noterai una variazione nella velocità di esecuzione delle query dopo aver eseguito di queste modifiche:

  • Modificare in modo significativo una grande quantità di dati esistenti che hanno un di Google.
  • Aggiunta, modifica o eliminazione di un indice secondario.

Puoi utilizzare diversi strumenti per identificare una query specifica che Spanner viene eseguito più lentamente del solito:

Una nota sui nuovi database

Quando esegui query su database appena creati con dati appena inseriti o importati, Spanner potrebbe non selezionare gli indici più appropriati, perché lo strumento di ottimizzazione delle query richiede fino a tre giorni per raccogliere le statistiche di ottimizzazione automaticamente. Per ottimizzare l'utilizzo dell'indice di un nuovo database Spanner prima rispetto a puoi creare manualmente un nuovo pacchetto di statistiche.

Esamina lo schema

Dopo aver trovato la query che ha rallentato, osserva l'istruzione SQL per e identifica le tabelle utilizzate dall'istruzione e le colonne che recupera da queste tabelle.

A questo punto, trova gli indici secondari esistenti per queste tabelle. Determina se uno degli indici include le colonne su cui esegui la query, significa che Spanner potrebbe usare uno degli indici per elaborare la query.

  • Se sono presenti indici applicabili, il passaggio successivo consiste nel trovare l'indice che Spanner utilizzato per la query.
  • Se non sono presenti indici applicabili, utilizza il metodo Comando gcloud spanner operations list per verificare se di recente hai eliminato un indice applicabile:

    gcloud spanner operations list \
        --instance=INSTANCE \
        --database=DATABASE \
        --filter="@TYPE:UpdateDatabaseDdlMetadata"
    

    Se hai rilasciato un indice applicabile, la modifica potrebbe aver interessato la query delle prestazioni. Aggiungi di nuovo l'indice secondario alla tabella. Dopo il giorno Spanner aggiunge l'indice, esegui di nuovo la query e controlla il suo delle prestazioni. Se il rendimento non migliora, il passaggio successivo è individuare i che Spanner ha usato per la query.

    Se non hai eliminato un indice applicabile, la selezione dell'indice non ha causato le prestazioni delle query in regressione. Cerca altre modifiche ai dati o all'utilizzo e che potrebbero aver influito sulle prestazioni.

Trovare l'indice utilizzato per una query

Per scoprire quale indice Spanner utilizza per elaborare una query, visualizza la piano di esecuzione query nella console Google Cloud:

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

    Vai alla pagina Istanze

  2. Fai clic sul nome dell'istanza su cui vuoi eseguire la query.

  3. Nel riquadro a sinistra, fai clic sul database su cui eseguire la query, quindi fai clic su Spanner Studio.

  4. Inserisci la query da testare.

  5. Nell'elenco a discesa Esegui query, seleziona Solo spiegazione. Spanner visualizza il piano di query.

Cerca almeno uno dei seguenti operatori nel piano di query:

  • Scansione tabella
  • Scansione indice
  • Cross apply o cross apply distribuito

Le sezioni seguenti spiegano il significato di ogni operatore.

Operatore di scansione tabella

L'operatore table scan indica che Spanner ha eseguito Non utilizzare un indice secondario:

Uno screenshot mostra un operatore di scansione delle tabelle in un piano di query.

Ad esempio, supponiamo che la tabella Albums non abbia indicizza ed esegui questa query:

SELECT AlbumTitle FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");

Poiché non esistono indici da utilizzare, il piano di query include una scansione delle tabelle operatore.

Operatore scansione indice

L'operatore scansione degli indici indica che Spanner ha utilizzato una indice secondario durante l'elaborazione della query:

Uno screenshot mostra un operatore di scansione dell'indice in un piano di query.

Ad esempio, supponi di aggiungere un indice alla tabella Albums:

CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);

Quindi esegui questa query:

SELECT AlbumTitle FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");

L'indice AlbumsByAlbumTitle contiene AlbumTitle, che è l'unica colonna selezionato dalla query. Di conseguenza, il piano di query include una scansione dell'indice operatore.

Operatore di applicazione incrociata

In alcuni casi, Spanner utilizza un indice che contiene solo alcuni dei colonne selezionate dalla query. Di conseguenza, Spanner deve unirsi all'indice con la tabella di base.

Quando si verifica questo tipo di join, il piano di query include una cross apply o distribuito incrociato l'operatore apply con quanto segue input:

  • Un operatore di scansione dell'indice per l'indice di una tabella
  • Un operatore di scansione della tabella per la tabella proprietaria dell'indice

Uno screenshot mostra un'applicazione incrociata distribuita in un piano di query, con una scansione dell'indice e una scansione della tabella come input.

Ad esempio, supponi di aggiungere un indice alla tabella Albums:

CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);

Quindi esegui questa query:

SELECT * FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");

L'indice AlbumsByAlbumTitle contiene AlbumTitle, ma la query ne seleziona tutti delle colonne della tabella, non solo AlbumTitle. Di conseguenza, il piano di query include un operatore Distributed Cross apply con una scansione dell'indice AlbumsByAlbumTitle e una scansione della tabella di Albums come input.

Scegli un indice diverso

Dopo aver trovato l'indice utilizzato da Spanner per la query, prova a eseguire la query con un indice diverso oppure analizzando la tabella di base utilizzando un indice. Per specificare l'indice, aggiungi un'istruzione FORCE_INDEX alla query di ricerca.

Se trovi una versione più veloce della query, aggiorna l'applicazione in modo che utilizzi il una versione più rapida.

Linee guida per la scelta di un indice

Segui queste linee guida per decidere quale indice testare per la query:

  • Se la query soddisfa uno di questi criteri, prova a utilizzare la tabella di base anziché un indice secondario:

    • La query verifica l'uguaglianza con un prefisso del campo principale della tabella di base (ad esempio, SELECT * FROM Albums WHERE SingerId = 1).
    • Un numero elevato di righe soddisfa i predicati della query (ad esempio, SELECT * FROM Albums WHERE AlbumTitle != "There Is No Album With This Title").
    • La query utilizza una tabella di base che contiene solo poche centinaia di righe.
  • Se la query contiene un predicato molto selettivo (ad esempio, REGEXP_CONTAINS, STARTS_WITH, <, <=, >, >= o !=), prova a usare un che includa le stesse colonne che utilizzi nel predicato.

Testa la query aggiornata

Utilizza la console Google Cloud per testare la query aggiornata e scoprire per quanto tempo necessario per elaborare la query.

Se la query include parametri di query e una query è associato ad alcuni valori molto più spesso di altri, quindi associa parametro di query con uno di questi valori nei test. Ad esempio, se query include un predicato come WHERE country = @countryId e quasi tutti delle query associa @countryId al valore US, poi associa @countryId a US per i test del rendimento. Questo approccio ti aiuta a ottimizzare query più frequenti.

Per testare la query aggiornata nella console Google Cloud, segui questi passaggi:

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

    Vai alla pagina Istanze

  2. Fai clic sul nome dell'istanza su cui vuoi eseguire la query.

  3. Nel riquadro a sinistra, fai clic sul database su cui eseguire la query, quindi fai clic su Spanner Studio.

  4. Inserisci la query da testare, inclusa l'istruzione FORCE_INDEX, e fai clic Esegui query:

    La console Google Cloud apre la scheda Tabella dei risultati, poi mostra i risultati della query, incluso il tempo impiegato da Spanner per elaborare la query.

    Questa metrica non include altre sorgenti di latenza, come l'ora la console Google Cloud ha impiegato per interpretare e visualizzare i risultati della query.

Ottieni il profilo dettagliato di una query in formato JSON utilizzando l'API REST

Per impostazione predefinita, quando si esegue una query vengono restituiti solo i risultati delle istruzioni. Questo perché QueryMode è impostato su NORMAL. Per includere statistiche di esecuzione dettagliate con risultati della query, imposta QueryMode su PROFILE.

Crea una sessione

Prima di aggiornare la modalità di query, crea una sessione. che rappresenta un canale di comunicazione con il database Spanner completamente gestito di Google Cloud.

  1. Fai clic su projects.instances.databases.sessions.create.
  2. Fornisci l'ID progetto, istanza e database nel seguente modo modulo:

    projects/[\PROJECT_ID\]/instances/[\INSTANCE_ID\]/databases/[\DATABASE_ID\]
    
  3. Fai clic su Execute (Esegui). La risposta mostra la sessione che hai creato modulo:

    projects/[\PROJECT_ID\]/instances/[\INSTANCE_ID\]/databases/[\DATABASE_ID\]/sessions/[\SESSION\]
    

    Lo utilizzerai per eseguire il profilo di query nel passaggio successivo. Il modello creato durerà al massimo un'ora tra utilizzi consecutivi prima di viene eliminato dal database.

Profila la query

Attiva la modalità PROFILE per la query.

  1. Fai clic su projects.instances.databases.sessions.executeSql.
  2. In session, inserisci l'ID sessione che hai creato nella passaggio precedente:

    projects/[PROJECT_ID]/instances/[INSTANCE_ID]/databases/[DATABASE_ID]/sessions/[SESSION]
    
  3. In Corpo della richiesta, utilizza quanto segue:

    {
      "sql": "[YOUR_SQL_QUERY]",
      "queryMode": "PROFILE"
    }
    
  4. Fai clic su Execute (Esegui). La risposta restituita includerà i risultati della query, piano di query e le statistiche di esecuzione per la query.