Lo strumento di ottimizzazione delle query di Spanner determina il modo più efficiente per eseguire una query SQL. Tuttavia, il piano di query determinato dallo strumento di ottimizzazione può cambiare leggermente quando lo strumento di ottimizzazione delle query stesso si evolve o quando le statistiche del database vengono aggiornate. Per ridurre al minimo la potenziale regressione del rendimento quando l'ottimizzatore delle query o le statistiche cambiano, Spanner fornisce 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 di ottimizzazione.
optimizer_statistics_package: Spanner aggiorna regolarmente le statistiche dell'ottimizzatore. Le nuove statistiche vengono rese disponibili come pacchetto. Questa opzione di query specifica un pacchetto di statistiche da utilizzare dall'ottimizzatore delle query prilikom compilacije query SQL. La garbage collection del pacchetto specificato deve essere disabilitata:
GoogleSQL
ALTER STATISTICS <package_name> SET OPTIONS (allow_gc=false)
PostgreSQL
ALTER STATISTICS spanner."<package_name>" SET OPTIONS (allow_gc = true)
Questa guida mostra come impostare queste singole opzioni in ambiti diversi in Spanner.
Elenca le opzioni dello strumento di ottimizzazione delle query
Spanner memorizza le informazioni sulle versioni dell'ottimizzatore disponibili e sui pacchetti di statistiche che puoi selezionare.
Versioni dello strumento di ottimizzazione
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 è 8.
Esegui la seguente istruzione SQL per restituire un elenco di tutte le versioni dell'ottimizzatore supportate, insieme alle relative date di rilascio e a indicare se la versione è predefinita. Il numero di versione più grande restituito è la versione più recente 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 superiore a 30 giorni tra una nuova uscita 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 dello strumento di ottimizzazione supportate. La colonna IS_DEFAULT
specifica quale versione è quella predefinita corrente.
Per informazioni dettagliate su ogni versione, vedi Cronologia delle versioni dell'ottimizzatore delle query.
Pacchetti di statistiche dello strumento di ottimizzazione
A ogni nuovo pacchetto di statistiche dell'ottimizzatore creato da Spanner viene assegnato un nome che è garantito 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, questa operazione viene eseguita dall'istruzione ANALYZE
. Il formato del nome del pacchetto di statistiche è
analyze_{PACKAGE_TIMESTAMP}UTC
, dove
{PACKAGE_TIMESTAMP}
è il timestamp, nel fuso orario UTC, dell'inizio della
costruzione delle statistiche. Esegui la seguente istruzione SQL per restituire un elenco di tutti i pacchetti di statistiche per l'ottimizzazione disponibili.
SELECT * FROM INFORMATION_SCHEMA.SPANNER_STATISTICS;
Per impostazione predefinita, Spanner utilizza il pacchetto di statistiche dello strumento di ottimizzazione più recente, a meno che il database o la query non sia bloccato su un pacchetto precedente utilizzando uno dei metodi descritti in questa pagina.
Precedenza dell'override delle opzioni
Se utilizzi un database con dialetto GoogleSQL, Spanner offre diversi modi per cambiare le opzioni dell'ottimizzatore. Ad esempio, puoi impostare le opzioni per una query specifica o configurare l'opzione 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 corrispondente in questo documento).
Valore predefinito di Spanner ← opzione di database ← app client ← variabile di ambiente ← query client ← suggerimento di dichiarazione
Ad esempio, ecco come interpretare l'ordine di precedenza quando imposti la versione dell'ottimizzatore delle query:
Quando crei un database, viene utilizzata la versione dell'ottimizzatore predefinito di Spanner. L'impostazione della versione dell'ottimizzatore utilizzando uno dei metodi elencati sopra ha la precedenza su qualsiasi impostazione a 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 utilizzando l'opzione database. L'impostazione della versione dello strumento di ottimizzazione tramite un suggerimento di istruzioni ha la precedenza più alta per la query specificata e ha la precedenza sul valore impostato utilizzando qualsiasi altro metodo.
Ora esaminiamo ciascun metodo in modo più dettagliato.
Impostare le opzioni di ottimizzazione a livello di database
Puoi impostare la versione dello strumento di ottimizzazione predefinita su un database utilizzando il seguente
comando DDL ALTER DATABASE
.
GoogleSQL
ALTER DATABASE MyDatabase
SET OPTIONS (optimizer_version = 8);
PostgreSQL
ALTER DATABASE MyDatabase SET spanner.optimizer_version = 5;
Puoi impostare il pacchetto di statistiche in modo simile, come mostrato nell'esempio seguente.
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 seguente comando DDL.
GoogleSQL
ALTER DATABASE MyDatabase
SET OPTIONS (optimizer_version = 8,
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 = 8 )'
PostgreSQL
gcloud spanner databases ddl update MyDatabase --instance=test-instance \
--ddl='ALTER DATABASE MyDatabase SET spanner.optimizer_version = 8'
Se imposti un'opzione del database su NULL
(in GoogleSQL) o DEFAULT
(in PostgreSQL), l'opzione viene cancellata in modo da utilizzare il valore predefinito.
Per visualizzare il valore corrente 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 dell'ottimizzatore con le librerie client
Quando interagisci con Spanner in modo programmatico tramite le librerie client, esistono diversi modi per modificare le opzioni di query per la tua applicazione client.
Per impostare le opzioni dell'ottimizzatore, devi utilizzare le versioni più recenti delle librerie client.
Impostare le opzioni di ottimizzazione per un client di database
Un'applicazione può impostare le opzioni dell'ottimizzatore a livello globale nella libreria client configurando la proprietà queryOptions come mostrato negli snippet di codice seguenti. Le impostazioni dell'ottimizzatore vengono memorizzate nell'istanza del client e applicate a tutte le query eseguite per tutta la durata del client. Anche se le opzioni si applicano a livello di database nel backend, quando vengono impostate a livello di client, si applicano a tutti i database collegati a quel client.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Impostare le opzioni dell'ottimizzatore con le variabili di ambiente
Per provare più facilmente impostazioni diverse dell'ottimizzatore senza dover ricompilare l'app, puoi impostare le variabili di ambiente SPANNER_OPTIMIZER_VERSION
e SPANNER_OPTIMIZER_STATISTICS_PACKAGE
ed eseguire l'app, come mostrato nello snippet seguente.
Linux / macOS
export SPANNER_OPTIMIZER_VERSION="8"
export SPANNER_OPTIMIZER_STATISTICS_PACKAGE="auto_20191128_14_47_22UTC"
Windows
set SPANNER_OPTIMIZER_VERSION="8"
set SPANNER_OPTIMIZER_STATISTICS_PACKAGE="auto_20191128_14_47_22UTC"
I valori delle opzioni dell'ottimizzatore delle query specificati vengono letti e memorizzati nell'istanza del client al momento dell'inizializzazione del client e applicati a tutte le query eseguite durante l'intero ciclo di vita del client.
Impostare le opzioni di ottimizzazione per una query del client
Puoi specificare un valore per la versione dell'ottimizzatore o del pacchetto di statistiche a livello di query nell'applicazione client specificando una proprietà di opzioni di query durante la creazione della query.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Impostare le opzioni dello strumento di ottimizzazione per una query utilizzando un suggerimento di istruzioni
Un suggerimento per l'istruzione è un suggerimento per un'istruzione query che modifica l'esecuzione della query rispetto al comportamento predefinito. L'impostazione del suggerimento OPTIMIZER_VERSION
su un'istruzione forza l'esecuzione della query utilizzando la versione dell'ottimizzatore delle query specificata.
L'indicazione OPTIMIZER_VERSION
ha la precedenza più alta per la versione dell'ottimizzatore. Se viene specificato il suggerimento di dichiarazione, verrà utilizzato indipendentemente da tutte le altre impostazioni della versione dell'ottimizzatore.
GoogleSQL
@{OPTIMIZER_VERSION=8} SELECT * FROM MyTable;
PostgreSQL
/*@OPTIMIZER_VERSION=8*/ SELECT * FROM MyTable;
Puoi anche utilizzare il valore letterale latest_version per impostare la versione dell'ottimizzatore per una query sulla versione più recente, come mostrato di seguito.
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 forza l'esecuzione della query utilizzando la versione del pacchetto di statistiche dello strumento di ottimizzazione delle query specificato. Per il pacchetto specificato
deve essere disabilitata la garbage collection rifiuti:
GoogleSQL
ALTER STATISTICS <package_name> SET OPTIONS (allow_gc=false)
PostgreSQL
ALTER STATISTICS spanner."package_name" SET OPTIONS (allow_gc=false)
L'indicazione OPTIMIZER_STATISTICS_PACKAGE
ha la priorità più alta per l'impostazione del pacchetto di ottimizzatori. Se viene specificato l'indizio di dichiarazione, 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 latest per utilizzare il pacchetto di 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 per una query sulla versione predefinita, che potrebbe essere diversa dall'ultima versione. Per informazioni dettagliate, consulta la sezione 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 dell'ottimizzatore quando si utilizza il driver JDBC Spanner
Puoi eseguire l'override del valore predefinito della versione dell'ottimizzatore e del pacchetto di statistiche 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 Spanner.
Puoi anche impostare la versione dell'ottimizzatore delle query utilizzando l'istruzione SET OPTIMIZER_VERSION
come mostrato nell'esempio seguente.
Per ulteriori dettagli sull'utilizzo del driver open source, consulta Utilizzare il driver JDBC open source.
Come vengono gestite le versioni dello strumento di ottimizzazione non valide
Spanner supporta una gamma di versioni dello strumento di ottimizzazione.
Questo intervallo cambia nel tempo quando lo strumento di ottimizzazione delle query viene aggiornato. Se la versione
specificata non è nell'intervallo, la query non va a buon fine. Ad esempio, se tenti di eseguire
una query con l'istruzione di suggerimento
@{OPTIMIZER_VERSION=9}
,
ma il numero di versione dello strumento di ottimizzazione più recente è solo
8
, Spanner risponde con
questo messaggio di errore:
Query optimizer version: 9 is not
supported
Gestire un'impostazione del pacchetto di statistiche dello strumento di ottimizzazione non valida
Puoi bloccare il tuo database o la tua query su qualsiasi pacchetto di statistiche disponibile utilizzando uno dei metodi descritti in precedenza in questa pagina. Una query non va a buon fine se viene fornito un nome del 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 nella console Google Cloud e in Google Cloud CLI.
Google Cloud console
Per visualizzare la versione dell'ottimizzatore utilizzata per una query, esegui la query nella pagina Spanner Studio della console Google Cloud e poi seleziona la scheda Spiegazione. Dovresti vedere un messaggio simile al seguente:
Versione dello strumento di ottimizzazione delle query: 8
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'
Visualizzare la versione dello strumento di ottimizzazione delle query in Metrics Explorer
Cloud Monitoring raccoglie misurazioni per aiutarti a comprendere il rendimento delle tue applicazioni e dei tuoi servizi di sistema. Una delle metriche raccolte per Spanner è il conteggio delle query, che misura il numero di query in un'istanza, campionato nel tempo. Sebbene questa metrica sia molto utile per visualizzare le query raggruppate per codice di errore, possiamo utilizzarla anche per vedere quale versione dello strumento di ottimizzazione è stata utilizzata per eseguire ogni query.
Puoi utilizzare Metric 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 viene 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 dell'ottimizzatore non valida, restituendo lo stato Uso improprio
e generando un conteggio delle query pari a 0. Gli altri database hanno eseguito query utilizzando rispettivamente le versioni 1 e 2 dello strumento di ottimizzazione.
Figura 1. Numero di query visualizzate in Metrics Explorer con query agrupate per versione dell'ottimizzatore.
Per configurare un grafico simile per la tua istanza:
- Vai a Esplora metriche 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
.
In questo esempio non è mostrato il caso in cui viene utilizzata una versione diversa dello strumento di ottimizzazione per query diverse nello stesso database. In questo caso, il grafico mostrerebbe un segmento di barra per ogni combinazione di database e versione dell'ottimizzatore.
Per scoprire come utilizzare Cloud Monitoring per monitorare le istanze Spanner, consulta Monitoraggio con Cloud Monitoring.