Questa pagina descrive e fornisce una cronologia delle varie versioni dell'ottimizzatore delle query di Spanner. La versione predefinita attuale è la 6. Per scoprire di più su questo strumento, consulta Informazioni sullo strumento di ottimizzazione delle query.
Spanner implementa gli aggiornamenti dello strumento di ottimizzazione delle query come nuove versioni. Per impostazione predefinita, ogni database inizia a utilizzare la versione più recente dell'ottimizzatore almeno 30 giorni dopo il rilascio della versione.
Se utilizzi un database di dialetti GoogleSQL, puoi gestire la versione dell'ottimizzazione delle query utilizzata dalle query. Prima di impegnarti per l'ultima versione, puoi confrontare i profili delle prestazioni delle query tra le versioni precedenti e l'ultima versione. 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 7: 22 maggio 2024 (più recente)
È stato aggiunto il supporto per la selezione dei piani Index Union in base ai costi.
È stato aggiunto il supporto per la selezione intelligente di piani di ricerca e scansione basati sulle statistiche per le query che non hanno predicati ricercabili per tutte le parti chiave.
È stato aggiunto il supporto per la selezione dei join hash basata sui costi.
Versione 6: 11 settembre 2023 (predefinita)
Push dei limiti e push dei predicati migliorati attraverso i join outer completi.
Stima della cardinalità e modello di costo migliorati.
Abilitata l'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, il posizionamento di ordinamento e la selezione di
GROUP BY
.Aggiunto il supporto per la selezione dell'algoritmo di join in base ai costi che sceglie tra hash e apply join. Il join di unione richiede comunque l'utilizzo di un suggerimento per le query.
Aggiunto il supporto per la commutatività dei join basata sui costi.
Versione 4: 1° marzo 2022
Miglioramenti alla selezione dell'indice secondario.
- Miglioramento dell'utilizzo dell'indice secondario in un join tra tabelle con interleaving.
- Copertura dell'utilizzo dell'indice secondario migliorata.
- Selezione dell'indice migliorata quando le statistiche dell'ottimizzatore non sono aggiornate.
- Preferisci gli indici secondari con predicati sulle colonne indicizzate leader anche se le statistiche dell'ottimizzatore non sono disponibili o se segnali che la tabella di base è piccola.
Introduce l'hashing a passaggio singolo, attivato dal nuovo hint
hash_join_execution
.Suggerimento di partecipazione:
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à è utile quando l'input del lato della build dell'hash join è grande. Un join hash con passaggio dovrebbe avere prestazioni migliori se osserva 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 di join hash.
- Anche la latenza sul file secondario destro dell'operatore di join hash è elevata.
Per impostazione predefinita (
hash_join_execution=multi_pass
), se l'input del lato build del join hash è troppo grande per essere contenuto nella memoria, il lato build viene suddiviso in più batch e potremmo analizzare il lato del probe più volte. Con la nuova modalità (hash_join_execution=one_pass
), un join hash viene trasferito sul disco se l'input lato build non può essere inserito nella memoria ed eseguirà sempre la scansione del lato del probe solo una volta.Un miglioramento nella selezione del numero di chiavi utilizzate per la ricerca.
Versione 3: 1° agosto 2021
Aggiunge un nuovo algoritmo di join, join di unione, abilitato utilizzando un nuovo valore di suggerimento per la query JOIN METHOD.
Suggerimento istruzione:
GoogleSQL
@{join_method=merge_join} SELECT ...
PostgreSQL
/*@ join_method=merge_join */ SELECT ...
Suggerimento di unione:
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 join, abilitato utilizzando un nuovo valore di suggerimento per la query JOIN METHOD.
Suggerimento di unione:
GoogleSQL
SELECT ... FROM (...) JOIN@{join_method=push_broadcast_hash_join} (...)
PostgreSQL
SELECT ... FROM (...) JOIN/*@ join_method=push_broadcast_hash_join} */ (...)
Introduce l'operatore unione di unione distribuita, che è abilitato per impostazione predefinita, se applicabile. Questa operazione migliora le prestazioni delle query.
Un piccolo miglioramento alle prestazioni di una scansione in un
GROUP BY
quando non è presente un 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 era richiesta dalla query.SELECT a, b FROM myTable GROUP BY a, b
Migliora le prestazioni di alcune query con
LIMIT
quando è presente un operatore di applicazione incrociata introdotto dai join e la query richiede risultati ordinati con LIMIT. Dopo la modifica, l'ottimizzatore applica prima l'ordinamento con il limite sul lato di input o "Cross apply".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 struct mediante join. Ciò migliora le prestazioni delle query in alcuni modi, ad esempio: è possibile eseguire più calcoli in modo distribuito ed è possibile eseguire anche il push-down di più operazioni che dipendono dai calcoli eseguiti. Ad esempio, la query ha un limite e l'ordinamento dipende da questi calcoli, quindi anche il limite può essere eseguito 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 un
GROUP BY
in determinate situazioni.
Versione 1: 18 giugno 2019
Include molte ottimizzazioni basate su regole come il push-down dei predicati, il pushdown limitato, il join ridondante e la rimozione di espressioni ridondanti, per citarne alcune.
Utilizza le statistiche sui dati utente per selezionare l'indice da utilizzare per accedere a ogni tabella.
Passaggi successivi
- Per scoprire di più su questo strumento, consulta Informazioni sullo strumento di ottimizzazione delle query.
- Per gestire sia la versione sia il pacchetto di statistiche per il tuo scenario, consulta Gestire lo strumento di ottimizzazione delle query.