Questa pagina descrive e fornisce una cronologia delle varie versioni di Strumento di ottimizzazione delle query di Spanner. L'attuale versione predefinita è 6. Per saperne di più sullo strumento di ottimizzazione delle query, consulta Informazioni sullo strumento di ottimizzazione delle query.
Spanner implementa gli aggiornamenti dello strumento di ottimizzazione delle query come nuove versioni dello strumento. Per impostazione predefinita, ogni database inizia a utilizzare la versione più recente dell'ottimizzatore non prima di 30 giorni dopo il rilascio della versione.
Se usi un database di dialetti GoogleSQL, puoi gestire la versione dello strumento di ottimizzazione delle query utilizzata dalle query. Prima di eseguire il commit alla versione più recente, puoi confrontare i profili di prestazioni delle query tra le versioni precedenti e la versione più recente. Per scoprire di più, consulta Gestire lo strumento di ottimizzazione delle query.
Cronologia delle versioni dello strumento di ottimizzazione delle query
Di seguito è riportato un riepilogo degli aggiornamenti apportati allo strumento di ottimizzazione delle query in ogni release.
Versione 6: 11 settembre 2023 (più recente e predefinita)
Miglioramento del pushing dei limiti e del push dei predicati attraverso join outer completi.
Stima della cardinalità e modello di costo migliorati.
Abilitazione dell'ottimizzazione basata sui costi per le query DML.
Versione 5: 15 luglio 2022
Modello di costo migliorato per la selezione degli indici, la gestione della distribuzione, l'ordinamento e la selezione di
GROUP BY
.Aggiunto il supporto per la selezione dell'algoritmo di join basato sui costi, che consente di scegliere tra hashing e apply join. L'unione mediante unione richiede ancora l'utilizzo di un suggerimento per la query.
Aggiunto il supporto per la commutatività dei join basata sui costi.
Versione 4: 1° marzo 2022
Miglioramenti alla selezione dell'indice secondario.
- È stato migliorato l'utilizzo degli indici secondari in un join tra tabelle con interleaving.
- Miglioramento della copertura dell'utilizzo degli indici secondari.
- Selezione dell'indice migliorata quando le statistiche dello strumento di ottimizzazione sono obsolete.
- Preferisci indici secondari con predicati nelle colonne indicizzate principali anche se le statistiche di ottimizzazione non sono disponibili o se la tabella di base è di dimensioni ridotte.
Introduci l'hashing a passaggio singolo, abilitato dal nuovo suggerimento
hash_join_execution
.Suggerimento per unire le persone:
GoogleSQL
SELECT ... FROM (...) JOIN@{join_method=hash_join, hash_join_execution=one_pass} (...)
PostgreSQL
SELECT ... FROM (...) JOIN/*@ join_method=hash_join, hash_join_execution=one_pass */ (...)
La nuova modalità è vantaggiosa quando l'input lato build del join hash è di grandi dimensioni. Si prevede che un passaggio hash join abbia prestazioni migliori se osservi quanto segue nel profilo di esecuzione della query:
- Il numero di esecuzioni nell'elemento figlio destro del join hash è maggiore del numero di esecuzioni sull'operatore hash join.
- Anche la latenza sul figlio destro dell'operatore di join hash è elevata.
Per impostazione predefinita (
hash_join_execution=multi_pass
), se l'input lato build del join hash è troppo grande per essere inserito in memoria, il lato build viene suddiviso in più batch e potremmo analizzare il lato probe più volte. Con la nuova modalità (hash_join_execution=one_pass
), un hash join si estenderà su disco se l'input lato build non è sufficiente in memoria ed eseguirà sempre la scansione del lato del probe una sola volta.Miglioramento della selezione del numero di chiavi da usare per la ricerca.
Versione 3: 1° agosto 2021
Aggiunge un nuovo algoritmo di join, unendo join, abilitato utilizzando un nuovo valore di suggerimento per la query JOIN Method.
Suggerimento sull'istruzione:
GoogleSQL
@{join_method=merge_join} SELECT ...
PostgreSQL
/*@ join_method=merge_join */ SELECT ...
Suggerimento per partecipare:
GoogleSQL
SELECT ... FROM (...) JOIN@{join_method=merge_join} (...)
PostgreSQL
SELECT ... FROM (...) JOIN/*@ join_method=merge_join */ (...)
Aggiunge un nuovo algoritmo di join, push join hash della trasmissione, abilitato utilizzando un nuovo valore di suggerimento di query JOIN Method.
Suggerimento per partecipare:
GoogleSQL
SELECT ... FROM (...) JOIN@{join_method=push_broadcast_hash_join} (...)
PostgreSQL
SELECT ... FROM (...) JOIN/*@ join_method=push_broadcast_hash_join} */ (...)
Presenta l'operatore unione di unione distribuita, che è abilitato per impostazione predefinita quando applicabile. Questa operazione migliora le prestazioni delle query.
Un piccolo miglioramento delle prestazioni di un'analisi in un
GROUP BY
quando non è presente alcun valore aggregato MAX o MIN (o HAVING MAX/MAX) nell'elenco SELECT. Prima di questa modifica, Spanner caricava la colonna non raggruppata aggiuntiva, anche se non era richiesta dalla query.Ad esempio, considera la seguente tabella:
GoogleSQL
CREATE TABLE myTable( a INT64, b INT64, c INT64, d INT64) PRIMARY KEY (a, b, c);
PostgreSQL
CREATE TABLE myTable( a bigint, b bigint, c bigint, d bigint, PRIMARY KEY(a, b, c) );
Prima di questa modifica, la seguente query avrebbe caricato la colonna
c
, anche se non è richiesta dalla query.SELECT a, b FROM myTable GROUP BY a, b
Migliora le prestazioni di alcune query con
LIMIT
quando viene introdotto un operatore cross apply dai join e la query richiede risultati ordinati con LIMIT. Dopo questa modifica, l'ottimizzatore applica prima l'ordinamento con il limite sul lato di input dell'applicazione incrociata.Esempio:
GoogleSQL
SELECT a2.* FROM Albums@{FORCE_INDEX=_BASE_TABLE} a1 JOIN Albums@{FORCE_INDEX=_BASE_TABLE} a2 USING(SingerId) ORDER BY a1.AlbumId LIMIT 2;
PostgreSQL
SELECT a2.* FROM albums/*@ force_index=_base_table */ a1 JOIN albums/*@ force_index=_base_table */ a2 USING(singerid) ORDER BY a1.albumid LIMIT 2;
Migliora le prestazioni delle query eseguendo il push di più calcoli tramite
JOIN
.Esegue il push di più calcoli che potrebbero includere una sottoquery o la creazione di strutture tramite join. Ciò migliora le prestazioni delle query in alcuni modi, ad esempio: È possibile eseguire più calcoli in modo distribuito e anche più operazioni che dipendono dai calcoli inviati possono essere spinte verso il basso. Ad esempio, la query ha un limite e l'ordinamento dipende da questi calcoli, quindi il limite può essere anche inviato tramite join.
Esempio:
SELECT t.ConcertDate, ( SELECT COUNT(*) FROM UNNEST(t.TicketPrices) p WHERE p > 10 ) AS expensive_tickets, u.VenueName FROM Concerts t JOIN Venues u ON t.VenueId = u.VenueId ORDER BY expensive_tickets LIMIT 2;
Versione 2: 1° marzo 2020
- Aggiunge ottimizzazioni nella selezione dell'indice.
- Migliora le prestazioni dei predicati
REGEXP_CONTAINS
eLIKE
in determinate circostanze. - Migliora le prestazioni di un'analisi in base a
GROUP BY
in determinate situazioni.
Versione 1: 18 giugno 2019
Include molte ottimizzazioni basate su regole, come il push-down predicato, il limite pushdown, i join ridondanti e la rimozione di espressioni ridondanti, solo per citarne alcune.
Utilizza le statistiche sui dati utente per selezionare l'indice da utilizzare per accedere a ogni tabella.
Passaggi successivi
- Per saperne di più sullo strumento di ottimizzazione delle query, consulta Informazioni sullo strumento di ottimizzazione delle query.
- Per gestire la versione dello strumento di ottimizzazione e il pacchetto di statistiche per il tuo scenario, consulta Gestire lo strumento di ottimizzazione delle query.