O Cloud Spanner fornece controle do otimizador por meio do controle de versão do otimizador de consultas. Este guia mostra como gerenciar a versão do otimizador de consultas que suas consultas usam.
Conforme implementamos as atualizações do otimizador de consultas do Cloud Spanner, nosso objetivo é melhorar os planos de execução de consultas e oferecer um desempenho melhor para suas consultas. Por padrão, o Cloud Spanner usa a versão mais recente do otimizador de consultas para cada banco de dados. Com o controle de versão do otimizador de consultas, é possível executar consultas em uma versão mais antiga do otimizador que oferece desempenho previsível.
Listar versões compatíveis do otimizador
A versão do otimizador de consultas é um valor inteiro, com aumento de 1 a cada atualização. A versão mais recente do otimizador de consultas é 2.
Execute a instrução SQL a seguir para retornar uma lista de todas as versões compatíveis do otimizador, juntamente com as datas de lançamento correspondentes. O maior número de versão retornado é a versão compatível mais recente do otimizador.
SELECT * FROM SPANNER_SYS.SUPPORTED_OPTIMIZER_VERSIONS
Por padrão, o Cloud Spanner usa a versão mais recente do otimizador, que atualmente é 2. Use um dos métodos descritos neste guia para modificar esse comportamento padrão para seu cenário.
Para ver detalhes sobre cada versão, consulte o Histórico de versões do otimizador de consultas.
Prioridade de substituição de versão
O Cloud Spanner oferece várias maneiras de alterar a versão do otimizador. Por exemplo, você pode definir a versão de uma consulta específica ou configurá-la na biblioteca de cliente no nível do processo ou da consulta. Quando a versão é definida de várias maneiras, a seguinte ordem de preferência é aplicada. Selecione um link para ir para a seção correspondente no documento.
Padrão do Cloud Spanner ← opção de banco de dados ← aplicativo cliente ← variável de ambiente ← consulta do cliente ← dica de instrução
Podemos interpretar a ordem de prioridades acima da seguinte maneira: quando você cria um banco de dados, ele usa a versão otimizada padrão do Cloud Spanner, que é sempre a versão mais recente. A configuração da versão do otimizador usando um dos métodos listados acima tem prioridade sobre qualquer item à esquerda dela. Por exemplo, a configuração do otimizador para um aplicativo usando uma variável de ambiente tem prioridade sobre qualquer valor definido para o banco de dados usando a opção de banco de dados. Definir a versão do otimizador por meio de uma dica de instrução tem a maior prioridade para a consulta especificada, prevalecendo sobre o valor definido com qualquer outro método.
Agora, analisaremos cada método mais detalhadamente.
Definir a versão do otimizador para um banco de dados usando ALTER DATABASE
Você pode definir a versão padrão do otimizador em um banco de dados usando o seguinte comando DDL ALTER DATABASE
.
ALTER DATABASE MyDatabase
SET OPTIONS (optimizer_version = 2);
Execute o ALTER DATABASE
no gcloud spanner com o comando gcloud spanner databases ddl update
da seguinte maneira.
gcloud spanner databases ddl update MyDatabase --instance=test-instance \
--ddl='ALTER DATABASE MyDatabase SET OPTIONS ( optimizer_version = 2 )'
Especificar a opção de banco de dados como NULL
faz ele ser limpo e definir a versão mais recente como padrão. Esse é o padrão para novos bancos de dados.
Para ver o valor atual dessa opção para um banco de dados, leia-o na visualização INFORMATION_SCHEMA.DATABASE_OPTIONS
.
Definir a versão do otimizador para um app cliente
Quando você interage de maneira programática com o Cloud Spanner por meio de bibliotecas de cliente, há várias maneiras de alterar a versão do otimizador para seu aplicativo cliente.
Um aplicativo pode definir uma opção de consulta global na biblioteca de cliente configurando a propriedade de opções de consulta, conforme mostrado nos snippets de código a seguir. A configuração da versão do otimizador é armazenada na instância do cliente e aplicada a todas as consultas executadas durante a vida útil do cliente. Mesmo que as opções se apliquem no nível do banco de dados no back-end, quando as opções são definidas no nível do cliente, elas se aplicam a todos os bancos de dados conectados por meio desse cliente.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Definir a versão do otimizador para um app cliente usando uma variável de ambiente
Para facilitar o teste de diferentes versões do otimizador sem precisar recompilar seu app, defina a variável de ambiente SPANNER_OPTIMIZER_VERSION
e execute o app, como mostra o snippet a seguir.
Linux/macOS
export SPANNER_OPTIMIZER_VERSION="2"
Windows
set SPANNER_OPTIMIZER_VERSION="2"
O valor da versão do otimizador de consultas especificado é lido e armazenado na instância do cliente no momento da inicialização e aplicado a todas as consultas executadas durante a vida útil do cliente.
Definir a versão do otimizador para uma consulta do cliente
Você pode estipular um valor para a versão do otimizador no nível da consulta no aplicativo cliente especificando uma propriedade de opções de consulta ao criá-la. Isso é ilustrado nos snippets de código a seguir para cada linguagem compatível.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Definir a versão do otimizador para uma consulta usando uma dica de instrução
Uma dica de instrução é uma dica em uma instrução de consulta que altera a execução da consulta do comportamento padrão. Definir a dica OPTIMIZER_VERSION
em uma instrução força essa consulta a ser executada usando a versão especificada do otimizador de consultas.
A dica OPTIMIZER_VERSION
tem a maior prioridade de versão do otimizador. Se a dica de instrução for especificada, ela será usada independentemente de todas as outras configurações de versão do otimizador.
@{OPTIMIZER_VERSION=2} SELECT * FROM MyTable
Você também pode usar o literal latest para definir a versão do otimizador de uma consulta como a versão mais recente, como mostrado aqui.
@{OPTIMIZER_VERSION=latest} SELECT * FROM MyTable
Definir a versão do otimizador usando o driver JDBC
Você pode substituir o valor padrão da versão do otimizador especificando uma versão na string de conexão JDBC, conforme mostrado no exemplo a seguir.
Também é possível definir a versão do otimizador de consultas usando a instrução SET OPTIMIZER_VERSION
, conforme mostrado no exemplo a seguir.
Para mais detalhes sobre como usar o driver de código aberto, consulte Como usar o driver JDBC de código aberto.
Como as versões inválidas do otimizador são processadas
O Cloud Spanner é compatível com uma variedade de versões do otimizador. Essas variedade muda ao longo do tempo quando o otimizador de consultas é atualizado. Se a versão especificada ao usar um dos métodos descritos neste guia estiver fora do conjunto de opções, o Cloud Spanner falhará na consulta. Por exemplo, se você tentar executar uma consulta com a versão do otimizador = 100 e, supondo que exceda o valor máximo atual, você receberá o erro abaixo.
Query optimizer version: 100 is not supported
Determinar a versão do otimizador de consultas usada para executar uma consulta
A versão do otimizador usada para uma consulta é visível no gcloud spanner e por meio do Console do Cloud.
gcloud spanner
Para ver a versão usada ao executar uma consulta no gcloud spanner, defina a sinalização --query-mode
como PROFILE
, conforme mostrado no snippet a seguir.
gcloud spanner databases execute-sql MyDatabase --instance=test-instance \
--query-mode=PROFILE --sql='SELECT * FROM MyTable'
Cloud Console
Para ver a versão do otimizador usada em uma consulta, execute a consulta na visualização Banco de dados de consulta do Console do Cloud e selecione a guia Explicação. Você verá uma mensagem semelhante a esta:
Esta consulta foi executada com a versão 2 do otimizador
Visualizar a versão do otimizador de consultas no Metrics Explorer
O Cloud Monitoring coleta medições para ajudar você a entender o desempenho dos seus aplicativos e serviços do sistema. Uma das métricas coletadas para o Cloud Spanner é Contagem de consultas, que mede o número de consultas em uma instância, amostrado ao longo do tempo. Embora essa métrica seja muito útil para ver consultas agrupadas por código de erro, é possível usá-la para ver qual versão do otimizador foi usada para executar cada consulta.
Use o Metrics Explorer no Console do Cloud para visualizar a Contagem de consultas da instância do banco de dados. A Figura 1 mostra a contagem de consultas para três bancos de dados. Você pode ver qual versão do otimizador está sendo usada em cada banco de dados.
A tabela abaixo do gráfico na figura mostra que my-db-1 tentou executar uma consulta com uma versão inválida do otimizador, retornando o status Uso inválido e resultando em uma contagem de consulta de 0. Os outros bancos de dados executaram consultas usando as versões 1 e 2 do otimizador, respectivamente.
Figura 1. Contagem de consultas exibidas no Metrics Explorer com consultas agrupadas pela versão do otimizador.
Para configurar um gráfico semelhante para a instância:
- Navegue até o Metrics Explorer no Console do Cloud.
- No campo Tipo de recurso, selecione
Cloud Spanner Instance
. - No campo Métrica, selecione
Count of queries
. - No campo Agrupar por, selecione
database
,optimizer_version
estatus
.
Não mostrado neste exemplo é o caso em que uma versão diferente do otimizador está sendo usada para diferentes consultas no mesmo banco de dados. Nesse caso, o gráfico exibirá um segmento de barras para cada combinação de banco de dados e versão do otimizador.
Para saber como usar o Cloud Monitoring para monitorar suas instâncias do Cloud Spanner, consulte Como monitorar com o Cloud Monitoring.