Lo strumento di ottimizzazione delle query di Spanner determina il modo più efficiente per eseguire una query SQL. Tuttavia, il piano di query determinato dall'ottimizzatore potrebbe cambiare leggermente con l'evoluzione dello strumento di ottimizzazione o quando le statistiche del database vengono aggiornate. Per ridurre al minimo qualsiasi potenziale regressione quando lo strumento di ottimizzazione delle query o le statistiche cambiano, Spanner offre le seguenti opzioni di query.
optimizer_version: le modifiche allo strumento di ottimizzazione delle query vengono raggruppate e rilasciate come versioni dello strumento di ottimizzazione. Spanner inizia a utilizzare la versione più recente dell'ottimizzatore come predefinita almeno 30 giorni dopo il rilascio della versione. Puoi utilizzare l'opzione della versione dello strumento di ottimizzazione delle query per eseguire query su una versione precedente dello strumento.
optimizer_statistics_package: Spanner aggiorna regolarmente le statistiche di ottimizzazione. Le nuove statistiche sono rese disponibili sotto forma di pacchetto. Questa opzione di query specifica un pacchetto di statistiche che lo strumento di ottimizzazione delle query deve utilizzare durante la compilazione di una query SQL. La garbage collection deve essere disabilitata per il pacchetto specificato:
GoogleSQL
ALTER STATISTICSSET OPTIONS (allow_gc=false)
PostgreSQL
ALTER STATISTICS spanner."" SET OPTIONS (allow_gc = true)
Questa guida mostra come impostare queste singole opzioni in ambiti diversi in Spanner.
Elenca opzioni di ottimizzazione delle query
Spanner archivia le informazioni sulle versioni dell'ottimizzatore e sui pacchetti di statistiche disponibili che puoi selezionare.
Versioni ottimizzatore
La versione dello strumento di ottimizzazione delle query è un valore intero, incrementato di 1 a ogni aggiornamento. L'ultima versione dello strumento di ottimizzazione delle query è 7.
Esegui la seguente istruzione SQL per restituire un elenco di tutte le versioni dell'ottimizzatore supportate, insieme alle relative date di rilascio e se quella versione è quella predefinita. Il numero di versione più grande restituito è l'ultima versione supportata dell'ottimizzatore.
SELECT * FROM SPANNER_SYS.SUPPORTED_OPTIMIZER_VERSIONS;
Versione predefinita
Per impostazione predefinita, Spanner inizia a utilizzare la versione più recente dell'ottimizzatore almeno 30 giorni dopo il rilascio della versione. Durante il periodo di oltre 30 giorni tra una nuova release e quella che diventa predefinita, ti consigliamo di testare le query sulla nuova versione per rilevare eventuali regressioni.
Per trovare la versione predefinita, esegui la seguente istruzione SQL:
SELECT * FROM SPANNER_SYS.SUPPORTED_OPTIMIZER_VERSIONS;
La query restituisce un elenco di tutte le versioni dell'ottimizzatore supportate. La colonna IS_DEFAULT
specifica la versione predefinita attuale.
Per informazioni dettagliate su ciascuna versione, consulta la pagina Cronologia delle versioni dello strumento di ottimizzazione delle query.
Pacchetti di statistiche dell'ottimizzatore
A ogni nuovo pacchetto di statistiche di ottimizzazione creato da Spanner viene assegnato un nome pacchetto che garantisce essere univoco all'interno del database specificato.
Il formato del nome del pacchetto è auto_{PACKAGE_TIMESTAMP}UTC
.
In GoogleSQL, l'istruzione ANALYZE
attiva la creazione del nome del pacchetto di statistiche. In PostgreSQL, l'istruzione ANALYZE
esegue questa attività. Il formato del nome del pacchetto di statistiche è
analyze_{PACKAGE_TIMESTAMP}UTC
, dove
{PACKAGE_TIMESTAMP}
è il timestamp, nel fuso orario UTC, dell'inizio della
creazione delle statistiche. Esegui questa istruzione SQL per restituire un elenco di tutti i pacchetti di statistiche di ottimizzazione disponibili.
SELECT * FROM INFORMATION_SCHEMA.SPANNER_STATISTICS;
Per impostazione predefinita, Spanner utilizza il pacchetto di statistiche di ottimizzazione più recente, a meno che il database o la query non siano bloccati a un pacchetto precedente utilizzando uno dei metodi descritti in questa pagina.
Priorità di override dell'opzione
Se utilizzi un database di dialetti GoogleSQL, Spanner offre diversi modi per modificare le opzioni di ottimizzazione. Ad esempio, puoi impostare le opzioni per una query specifica o configurarle nella libreria client a livello di processo o query. Quando un'opzione è impostata in più modi, si applica il seguente ordine di precedenza. Seleziona un link per passare alla sezione del documento corrispondente.
Valore predefinito di Spanner ← opzione di database ↑ app client → variabile di ambiente ↑ query del client "> suggerimento dell'istruzione
Ad esempio, ecco come interpretare l'ordine di precedenza quando imposti la versione dello strumento di ottimizzazione delle query:
Quando crei un database, questo utilizza la versione predefinita dell'ottimizzatore di Spanner. L'impostazione della versione dello strumento di ottimizzazione utilizzando uno dei metodi sopra elencati ha la precedenza su tutti gli elementi alla sinistra. Ad esempio, l'impostazione dell'ottimizzatore per un'app che utilizza una variabile di ambiente ha la precedenza su qualsiasi valore impostato per il database mediante l'opzione del database. L'impostazione della versione dello strumento di ottimizzazione tramite un suggerimento ha la precedenza più alta per la query specificata, con la precedenza sul valore impostato utilizzando qualsiasi altro metodo.
Esaminiamo ciascun metodo in modo più dettagliato.
Imposta le opzioni di ottimizzazione a livello di database
Puoi impostare la versione predefinita dell'ottimizzatore su un database utilizzando il seguente comando DDL di ALTER DATABASE
.
GoogleSQL
ALTER DATABASE MyDatabase
SET OPTIONS (optimizer_version = 7);
PostgreSQL
ALTER DATABASE MyDatabase SET spanner.optimizer_version = 5;
Puoi impostare il pacchetto di statistiche in modo simile, come mostrato nell'esempio che segue.
GoogleSQL
ALTER DATABASE MyDatabase
SET OPTIONS (optimizer_statistics_package = "auto_20191128_14_47_22UTC");
PostgreSQL
ALTER DATABASE MyDatabase
SET spanner.optimizer_statistics_package = "auto_20191128_14_47_22UTC";
Puoi anche impostare più di un'opzione contemporaneamente, come mostrato nel comando DDL che segue.
GoogleSQL
ALTER DATABASE MyDatabase
SET OPTIONS (optimizer_version = 7,
optimizer_statistics_package = "auto_20191128_14_47_22UTC");
Puoi eseguire ALTER DATABASE
in gcloud CLI con il comando gcloud CLI databases ddl update
come segue.
GoogleSQL
gcloud spanner databases ddl update MyDatabase --instance=test-instance \
--ddl='ALTER DATABASE MyDatabase SET OPTIONS ( optimizer_version = 7 )'
PostgreSQL
gcloud spanner databases ddl update MyDatabase --instance=test-instance \
--ddl='ALTER DATABASE MyDatabase SET spanner.optimizer_version = 7'
Se imposti un'opzione di database su NULL
(in GoogleSQL) o DEFAULT
(in PostgreSQL), viene cancellata in modo che venga utilizzato il valore predefinito.
Per visualizzare il valore attuale di queste opzioni per un database, esegui una query sulla vista INFORMATION_SCHEMA.DATABASE_OPTIONS
per GoogleSQL o sulla tabella information_schema database_options
per PostgreSQL come segue.
GoogleSQL
SELECT
s.OPTION_NAME,
s.OPTION_VALUE
FROM
INFORMATION_SCHEMA.DATABASE_OPTIONS s
WHERE
s.SCHEMA_NAME=""
AND s.OPTION_NAME IN ('optimizer_version', 'optimizer_statistics_package')
PostgreSQL
SELECT
s.option_name,
s.option_value
FROM
information_schema.database_options s
WHERE
s.schema_name='public'
AND s.option_name IN ('optimizer_version',
'optimizer_statistics_package')
Impostare le opzioni di ottimizzazione con le librerie client
Quando interagisci in modo programmatico con Spanner tramite le librerie client, esistono diversi modi per modificare le opzioni di query per la tua applicazione client.
Per impostare le opzioni di ottimizzazione, devi utilizzare le versioni più recenti delle librerie client.
Imposta le opzioni di ottimizzazione per un client di database
Un'applicazione può impostare le opzioni di ottimizzazione a livello globale nella libreria client configurando la proprietà delle opzioni di query come mostrato negli snippet di codice riportati di seguito. Le impostazioni di ottimizzazione vengono archiviate nell'istanza del client e applicate a tutte le query eseguite durante il ciclo di vita del client. Anche se le opzioni si applicano a livello di database nel backend, quando sono impostate a livello di client, si applicano a tutti i database connessi al client.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Imposta le opzioni di ottimizzazione con le variabili di ambiente
Per provare più facilmente diverse impostazioni di ottimizzazione senza dover
ricompilare la tua app, puoi impostare le variabili di ambiente SPANNER_OPTIMIZER_VERSION
e
SPANNER_OPTIMIZER_STATISTICS_PACKAGE
ed eseguire la tua app,
come mostrato nel seguente snippet.
Linux / macOS
export SPANNER_OPTIMIZER_VERSION="7"
export SPANNER_OPTIMIZER_STATISTICS_PACKAGE="auto_20191128_14_47_22UTC"
Windows
set SPANNER_OPTIMIZER_VERSION="7"
set SPANNER_OPTIMIZER_STATISTICS_PACKAGE="auto_20191128_14_47_22UTC"
I valori delle opzioni di ottimizzazione delle query specificate vengono letti e archiviati nell'istanza del client al momento dell'inizializzazione del client e si applicano a tutte le query eseguite per tutta la durata del client.
Impostare le opzioni di ottimizzazione per una query client
Puoi specificare un valore per la versione dell'ottimizzatore o la versione del pacchetto di statistiche a livello di query nella tua applicazione client specificando una proprietà opzioni di query durante la creazione della query.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Imposta le opzioni di ottimizzazione per una query utilizzando un suggerimento delle istruzioni
Un suggerimento è un suggerimento su un'istruzione di query che modifica l'esecuzione della query rispetto al comportamento predefinito. L'impostazione del suggerimento OPTIMIZER_VERSION
su
un'istruzione ne impone l'esecuzione con la versione specificata dello strumento di ottimizzazione delle query.
Il suggerimento OPTIMIZER_VERSION
ha la precedenza più alta per la versione dello strumento di ottimizzazione. Se
il suggerimento dell'istruzione è specificato, verrà utilizzato indipendentemente da tutte
le altre impostazioni della versione dello strumento di ottimizzazione.
GoogleSQL
@{OPTIMIZER_VERSION=7} SELECT * FROM MyTable;
PostgreSQL
/*@OPTIMIZER_VERSION=7*/ SELECT * FROM MyTable;
Puoi anche utilizzare il valore letterale latest_version per impostare la versione dell'ottimizzatore di una query sulla versione più recente, come mostrato qui.
GoogleSQL
@{OPTIMIZER_VERSION=latest_version} SELECT * FROM MyTable;
PostgreSQL
/*@OPTIMIZER_VERSION=latest_version*/ SELECT * FROM MyTable;
L'impostazione del suggerimento OPTIMIZER_STATISTICS_PACKAGE
su
un'istruzione ne forza l'esecuzione con la versione del pacchetto delle statistiche di
strumento di ottimizzazione delle query specificata. Per il pacchetto specificato
deve essere disattivata la garbage collection:
GoogleSQL
ALTER STATISTICS <package_name> SET OPTIONS (allow_gc=false)
PostgreSQL
ALTER STATISTICS spanner."package_name" SET OPTIONS (allow_gc=false)
Il suggerimento OPTIMIZER_STATISTICS_PACKAGE
ha la precedenza più alta per le impostazioni del pacchetto di ottimizzazione. Se viene specificato, il suggerimento dell'istruzione verrà utilizzato indipendentemente da tutte le altre impostazioni della versione del pacchetto di ottimizzazione.
@{OPTIMIZER_STATISTICS_PACKAGE=auto_20191128_14_47_22UTC} SELECT * FROM MyTable;
Puoi anche utilizzare il valore letterale più recente per utilizzare il pacchetto delle statistiche più recente.
@{OPTIMIZER_STATISTICS_PACKAGE=latest} SELECT * FROM MyTable;
Entrambi i suggerimenti possono essere impostati in un'unica istruzione, come mostrato nell'esempio seguente.
Il valore letterale default_version imposta la versione dello strumento di ottimizzazione di una query sulla versione predefinita, che potrebbe essere diversa dall'ultima versione. Per maggiori dettagli, vedi Versione predefinita.
GoogleSQL
@{OPTIMIZER_VERSION=default_version, OPTIMIZER_STATISTICS_PACKAGE=auto_20191128_14_47_22UTC} SELECT * FROM MyTable;
PostgreSQL
/*@OPTIMIZER_VERSION=default_version, OPTIMIZER_STATISTICS_PACKAGE=auto_20191128_14_47_22UTC*/ SELECT * FROM KeyValue;
Impostare le opzioni di ottimizzazione quando si utilizza il driver JDBC di Spanner
Puoi eseguire l'override del valore predefinito della versione e del pacchetto di statistiche dello strumento di ottimizzazione specificando le opzioni nella stringa di connessione JDBC, come mostrato nell'esempio seguente.
Queste opzioni sono supportate solo nelle versioni più recenti del driver JDBC di Spanner.
Puoi anche impostare la versione dello strumento di ottimizzazione delle query utilizzando l'istruzione SET OPTIMIZER_VERSION
, come mostrato nell'esempio seguente.
Per maggiori dettagli sull'utilizzo del driver open source, consulta la pagina relativa all'utilizzo del driver JDBC open source.
Come vengono gestite le versioni dello strumento di ottimizzazione non valide
Spanner supporta un intervallo di versioni dell'ottimizzatore.
Questo intervallo cambia nel tempo quando viene aggiornato lo strumento di ottimizzazione delle query. Se la versione specificata non rientra nell'intervallo, la query non riesce. Ad esempio, se provi a eseguire una query con il suggerimento dell'istruzione @{OPTIMIZER_VERSION=8}
, ma il numero di versione dell'ottimizzatore più recente è solo 7
, Spanner risponde con questo messaggio di errore:
Query optimizer version: 8 is not
supported
Gestire un'impostazione del pacchetto di statistiche di ottimizzazione non valida
Puoi bloccare il database o la query su qualsiasi pacchetto di statistiche disponibile utilizzando uno dei metodi descritti in precedenza in questa pagina. Una query non riesce se viene fornito un nome di pacchetto di statistiche non valido. Un pacchetto di statistiche specificato da una query deve essere:
Determinare la versione dello strumento di ottimizzazione delle query utilizzata per eseguire una query
La versione dell'ottimizzatore utilizzata per una query è visibile tramite la console Google Cloud e Google Cloud CLI.
Console Google Cloud
Per visualizzare la versione dell'ottimizzatore utilizzata per una query, esegui la query nella pagina Spanner Studio della console Google Cloud, poi seleziona la scheda Spiegazione. Dovresti vedere un messaggio simile al seguente:
Versione dello strumento di ottimizzazione delle query: 7
Interfaccia a riga di comando gcloud
Per visualizzare la versione utilizzata durante l'esecuzione di una query in gcloud CLI, imposta il flag --query-mode
su PROFILE
come mostrato nello snippet seguente.
gcloud spanner databases execute-sql MyDatabase --instance=test-instance \
--query-mode=PROFILE --sql='SELECT * FROM MyTable'
Visualizza la versione dello strumento di ottimizzazione delle query in Metrics Explorer
Cloud Monitoring raccoglie misurazioni per aiutarti a comprendere le prestazioni delle tue applicazioni e dei tuoi servizi di sistema. Una delle metriche raccolte per Spanner è il conteggio di query, che misura il numero di query in un'istanza, campionate nel tempo. Questa metrica è molto utile per visualizzare le query raggruppate per codice di errore, ma può essere utilizzata anche per vedere quale versione dell'ottimizzatore è stata utilizzata per eseguire ogni query.
Puoi utilizzare Metrics Explorer nella console Google Cloud per visualizzare il Conteggio delle query per l'istanza del database. La figura 1 mostra il conteggio delle query per tre database. Puoi vedere quale versione dell'ottimizzatore è utilizzata in ogni database.
La tabella sotto il grafico in questa figura mostra che my-db-1
ha tentato di eseguire una query con una versione dello strumento di ottimizzazione non valida, restituendo lo stato Utilizzo non valido e ottenendo un conteggio di query pari a 0. Gli altri database hanno eseguito query utilizzando rispettivamente le versioni 1 e 2 dell'ottimizzatore.
Figura 1. Numero di query visualizzato in Metrics Explorer con query raggruppate per versione di ottimizzazione.
Per configurare un grafico simile per l'istanza:
- Vai a Metrics Explorer nella console Google Cloud.
- Nel campo Tipo di risorsa, seleziona
Cloud Spanner Instance
. - Nel campo Metrica, seleziona
Count of queries
. - Nel campo Raggruppa per, seleziona
database
,optimizer_version
estatus
.
Non mostrato in questo esempio è il caso in cui viene utilizzata una versione dell'ottimizzatore diversa per query diverse nello stesso database. In questo caso, il grafico mostrerà un segmento a barre per ogni combinazione di versione del database e dell'ottimizzatore.
Per scoprire come utilizzare Cloud Monitoring per monitorare le istanze Spanner, consulta Monitoraggio con Cloud Monitoring