Quando usa consultas SQL para procurar dados, o Spanner usa automaticamente quaisquer índices secundários que possam ajudar a obter os dados de forma mais eficiente. No entanto, em alguns casos, o Spanner pode escolher um índice que faz com que as consultas sejam mais lentas. Como resultado, pode reparar que algumas consultas são executadas mais lentamente do que no passado.
Esta página explica como detetar alterações na velocidade de execução de consultas, inspecionar o plano de execução de consultas para essas consultas e especificar um índice diferente para consultas futuras, se necessário.
Detete alterações na velocidade de execução de consultas
É mais provável que veja uma alteração na velocidade de execução das consultas depois de fazer uma destas alterações:
- Alterar significativamente uma grande quantidade de dados existentes que tenham um índice secundário.
- Adicionar, alterar ou eliminar um índice secundário.
Pode usar várias ferramentas diferentes para identificar uma consulta específica que o Spanner está a executar mais lentamente do que o habitual:
- Estatísticas de consultas e Estatísticas de consultas.
Métricas específicas da aplicação que captura e analisa com o Cloud Monitoring. Por exemplo, pode monitorizar a métrica Contagem de consultas para determinar o número de consultas numa instância ao longo do tempo e saber que versão do otimizador de consultas foi usada para executar uma consulta.
Ferramentas de monitorização do lado do cliente que medem o desempenho da sua aplicação.
Uma nota sobre novas bases de dados
Quando consulta bases de dados recém-criadas com dados recém-inseridos ou importados, o Spanner pode não selecionar os índices mais adequados, porque o otimizador de consultas demora até três dias a recolher estatísticas do otimizador automaticamente. Para otimizar a utilização de índices de uma nova base de dados do Spanner mais cedo do que o previsto, pode criar manualmente um novo pacote de estatísticas.
Reveja o esquema
Depois de encontrar a consulta que ficou mais lenta, analise a declaração SQL da consulta e identifique as tabelas que a declaração usa e as colunas que obtém dessas tabelas.
Em seguida, encontre os índices secundários existentes para essas tabelas. Determine se algum dos índices inclui as colunas que está a consultar, o que significa que o Spanner pode usar um dos índices para processar a consulta.
- Se existirem índices aplicáveis, o passo seguinte é encontrar o índice que o Spanner usou para a consulta.
Se não existirem índices aplicáveis, use o comando
gcloud spanner operations list
para verificar se eliminou recentemente um índice aplicável:gcloud spanner operations list \ --instance=INSTANCE \ --database=DATABASE \ --filter="@TYPE:UpdateDatabaseDdlMetadata"
Se removeu um índice aplicável, essa alteração pode ter afetado o desempenho das consultas. Adicione novamente o índice secundário à tabela. Depois de o Spanner adicionar o índice, execute a consulta novamente e analise o respetivo desempenho. Se o desempenho não melhorar, o passo seguinte é encontrar o índice que o Spanner usou para a consulta.
Se não eliminou um índice aplicável, a seleção de índices não fez com que o desempenho das consultas regredisse. Procure outras alterações aos seus dados ou padrões de utilização que possam ter afetado o desempenho.
Encontre o índice usado para uma consulta
Para saber que índice o Spanner está a usar para processar uma consulta, veja o plano de execução de consultas na Google Cloud consola:
Aceda à página Instances do Spanner na Google Cloud consola.
Clique no nome da instância que quer consultar.
No painel esquerdo, clique na base de dados que quer consultar e, de seguida, clique em
Spanner Studio.Introduza a consulta a testar.
Na lista pendente Executar consulta, selecione Apenas explicação. O Spanner apresenta o plano de consulta.
Procure, pelo menos, um dos seguintes operadores no plano de consulta:
- Análise de tabelas
- Análise de índice
- Aplicação cruzada ou aplicação cruzada distribuída
As secções seguintes explicam o significado de cada operador.
Operador de leitura de tabelas
O operador table scan indica que o Spanner não usou um índice secundário:
Por exemplo, suponha que a tabela Albums
não tem índices secundários e executa a seguinte consulta:
SELECT AlbumTitle FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");
Uma vez que não existem índices a usar, o plano de consulta inclui um operador de análise de tabela.
Operador de análise de índice
O operador index scan indica que o Spanner usou um índice secundário quando processou a consulta:
Por exemplo, suponhamos que adiciona um índice à tabela Albums
:
CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);
Em seguida, execute a seguinte consulta:
SELECT AlbumTitle FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");
O índice AlbumsByAlbumTitle
contém AlbumTitle
, que é a única coluna
que a consulta seleciona. Como resultado, o plano de consulta inclui um operador de análise de índice.
Operador de aplicação cruzada
Em alguns casos, o Spanner usa um índice que contém apenas algumas das colunas que a consulta seleciona. Como resultado, o Spanner tem de juntar o índice à tabela base.
Quando este tipo de junção ocorre, o plano de consulta inclui um operador cross apply ou distributed cross apply que tem as seguintes entradas:
- Um operador de análise de índice para o índice de uma tabela
- Um operador de análise de tabela para a tabela proprietária do índice
Por exemplo, suponhamos que adiciona um índice à tabela Albums
:
CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);
Em seguida, execute a seguinte consulta:
SELECT * FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");
O índice AlbumsByAlbumTitle
contém AlbumTitle
, mas a consulta seleciona todas as colunas na tabela e não apenas AlbumTitle
. Como resultado, o plano de consulta inclui um operador de aplicação cruzada distribuído, com uma análise de índice de AlbumsByAlbumTitle
e uma análise de tabela de Albums
como entradas.
Escolha um índice diferente
Depois de encontrar o índice que o Spanner usou para a sua consulta, experimente executar a consulta com um índice diferente ou analisando a tabela base em vez de usar um índice. Para especificar o índice, adicione uma diretiva FORCE_INDEX
à
consulta.
Se encontrar uma versão mais rápida da consulta, atualize a sua aplicação para usar a versão mais rápida.
Diretrizes para escolher um índice
Use estas diretrizes para decidir que índice testar para a consulta:
Se a sua consulta cumprir algum destes critérios, experimente usar a tabela base em vez de um índice secundário:
- A consulta verifica a igualdade com um prefixo da chave
primária da tabela base (por exemplo,
SELECT * FROM Albums WHERE SingerId = 1
). - Um grande número de linhas satisfaz os predicados de consulta (por exemplo,
SELECT * FROM Albums WHERE AlbumTitle != "There Is No Album With This Title"
). - A consulta usa uma tabela base que contém apenas algumas centenas de linhas.
- A consulta verifica a igualdade com um prefixo da chave
primária da tabela base (por exemplo,
Se a consulta contiver um predicado muito seletivo (por exemplo,
REGEXP_CONTAINS
,STARTS_WITH
,<
,<=
,>
,>=
ou!=
), experimente usar um índice que inclua as mesmas colunas que usa no predicado.
Teste a consulta atualizada
Use a Google Cloud consola para testar a consulta atualizada e saber quanto tempo demora a processar a consulta.
Se a sua consulta incluir parâmetros de consulta e um parâmetro de consulta estiver associado a alguns valores com muito mais frequência do que outros, associe o parâmetro de consulta a um desses valores nos seus testes. Por exemplo, se a consulta incluir um predicado como WHERE country = @countryId
e quase todas as suas consultas associarem @countryId
ao valor US
, associe @countryId
a US
para os seus testes de desempenho. Esta abordagem ajuda a otimizar as consultas que executa com mais frequência.
Para testar a consulta atualizada na Google Cloud consola, siga estes passos:
Aceda à página Instances do Spanner na Google Cloud consola.
Clique no nome da instância que quer consultar.
No painel esquerdo, clique na base de dados que quer consultar e, de seguida, clique em
Spanner Studio.Introduza a consulta a testar, incluindo a diretiva
FORCE_INDEX
, e clique em Executar consulta.A Google Cloud consola abre o separador Tabela de resultados e, em seguida, mostra os resultados da consulta, incluindo o tempo que o serviço Spanner demorou a processar a consulta.
Esta métrica não inclui outras origens de latência, como o tempo que a consola demorou a interpretar e apresentar os resultados da consulta. Google Cloud
Obtenha o perfil detalhado de uma consulta no formato JSON através da API REST
Por predefinição, apenas são devolvidos resultados de declarações quando executa uma consulta.
Isto deve-se ao facto de QueryMode estar definido como NORMAL
.
Para incluir estatísticas de execução detalhadas com os resultados da consulta, defina QueryMode como PROFILE
.
Crie uma sessão
Antes de atualizar o modo de consulta, crie uma sessão, que representa um canal de comunicação com o serviço de base de dados do Spanner.
- Clique em
projects.instances.databases.sessions.create
. Indique o ID do projeto, da instância e da base de dados no seguinte formulário:
projects/[\PROJECT_ID\]/instances/[\INSTANCE_ID\]/databases/[\DATABASE_ID\]
Clique em Executar. A resposta mostra a sessão que criou neste formulário:
projects/[\PROJECT_ID\]/instances/[\INSTANCE_ID\]/databases/[\DATABASE_ID\]/sessions/[\SESSION\]
Vai usá-lo para executar o perfil de consulta no passo seguinte. A sessão criada vai estar ativa durante, no máximo, uma hora entre utilizações consecutivas antes de ser eliminada pela base de dados.
Analise o perfil da consulta
Ative o modo PROFILE
para a consulta.
- Clique em
projects.instances.databases.sessions.executeSql
. Para sessão, introduza o ID da sessão que criou no passo anterior:
projects/[PROJECT_ID]/instances/[INSTANCE_ID]/databases/[DATABASE_ID]/sessions/[SESSION]
Para o corpo do pedido, use o seguinte:
{ "sql": "[YOUR_SQL_QUERY]", "queryMode": "PROFILE" }
Clique em Executar. A resposta devolvida inclui os resultados da consulta, o plano de consulta e as estatísticas de execução da consulta.