Esta página descreve o otimizador de consultas do Spanner e as respetivas vantagens. O otimizador de consultas está disponível para bases de dados com dialeto GoogleSQL e bases de dados com dialeto PostgreSQL.
Vista geral
O otimizador de consultas SQL do Spanner converte uma declaração SQL declarativa, que descreve os dados que a consulta quer, num plano de execução imperativo, que descreve uma forma de obter precisamente esses dados. O processo de transformar uma declaração declarativa num plano de execução de consultas envolve a realização de transformações nas estruturas de árvore usadas para representar a consulta. O otimizador, no processo de produção de um plano de execução, preserva o significado lógico da consulta SQL original para que sejam devolvidas as linhas corretas.
Outro papel importante do otimizador é produzir um plano de execução eficiente.
Como é que o otimizador do Spanner produz planos de execução eficientes?
O otimizador do Spanner usa uma combinação de heurísticas bem estabelecidas e otimização baseada em custos para produzir planos eficientes. Algumas heurísticas são muito simples, como "executar filtros em máquinas remotas em vez de transferir dados para a máquina local". Outras heurísticas são mais complexas, mas continuam a incorporar o princípio de mover a lógica que reduz o volume de dados para mais perto dos dados. Esse princípio é particularmente importante num sistema que divide os dados em várias máquinas.
Nem todas as decisões de execução podem ser tomadas de forma eficaz através destas regras fixas. Por isso, o otimizador do Spanner também toma decisões com base num custo estimado das alternativas. Estas estimativas de custos são calculadas com base na estrutura da consulta, no esquema da base de dados e nas estimativas do volume de dados que serão produzidos por fragmentos da consulta. Por exemplo, o Spanner
calcula quantas linhas da tabela Songs se qualificam para o filtro
SongGenre = "Country"
se esse filtro aparecer numa consulta. Para ajudar no cálculo dessas estimativas, o Spanner recolhe periodicamente estatísticas para caraterizar a distribuição dos dados numa base de dados.
Além disso, o Spanner otimiza a execução de consultas determinando automaticamente se deve ser usado um método de processamento orientado por linhas ou colunas para a consulta. Para mais informações, consulte o artigo Otimize as análises.
Para saber mais sobre os planos de execução de consultas e como são usados pelo Spanner para executar consultas num ambiente distribuído, consulte o artigo Planos de execução de consultas.
Controlo de versões do otimizador de consultas
Ao longo do tempo, o otimizador de consultas do Spanner vai evoluir, alargando o conjunto de opções no plano de execução de consultas e melhorando a precisão das estimativas que informam essas opções, o que leva a planos de execução de consultas mais eficientes.
O Spanner lança atualizações do otimizador como novas versões do otimizador de consultas para melhorar a eficiência dos respetivos planos de execução de consultas. Para saber mais acerca das diferentes versões, consulte o artigo Versões do otimizador de consultas do Spanner.
Consultar pacotes de estatísticas do otimizador
O Spanner mantém estatísticas sobre a distribuição de dados das colunas das tabelas para ajudar a estimar quantas linhas serão produzidas por uma consulta. O otimizador de consultas usa estas estimativas para ajudar a escolher o melhor plano de execução de consultas. Estas estatísticas são atualizadas periodicamente pelo Spanner. Uma vez que as estatísticas são usadas para escolher planos de execução de consultas, quando as estatísticas são atualizadas, é possível que o Spanner altere o plano de consulta que usa para uma consulta.
Por predefinição, as bases de dados usam automaticamente o pacote de estatísticas gerado mais recente. Pode fixar a sua base de dados a uma versão anterior do pacote de estatísticas. Também tem a opção de executar consultas individuais com um pacote de estatísticas diferente do mais recente.
Construa um novo pacote de estatísticas
O Spanner gera automaticamente um novo pacote de estatísticas a cada três dias. Para criar um novo pacote de estatísticas manualmente, use a declaração DDL do GoogleSQL ANALYZE
ou a declaração DDL do PostgreSQL ANALYZE
.
Após alterações significativas aos dados ou ao esquema da base de dados, a criação de um novo pacote de estatísticas pode beneficiar o desempenho das consultas. Como prática recomendada, crie um novo pacote de estatísticas se ocorrer o seguinte:
- A base de dados processa uma grande quantidade de inserções, atualizações ou eliminações.
- Adiciona um novo índice à base de dados.
- Adiciona uma nova coluna a uma tabela.
A execução de uma ANALYZE
declaração DDL
atualiza o seu esquema, inicia uma
operação de longa duração
e cancela a criação de estatísticas acionadas automaticamente.
Depois de o Spanner terminar a execução da declaração, o otimizador de consultas demora até dez minutos a ter em conta um novo pacote de estatísticas no planeamento de consultas.
Recolha de lixo de pacotes de estatísticas
Os pacotes de estatísticas no Spanner são mantidos durante um período de 30 dias desde a respetiva criação, após o qual estão sujeitos à recolha de lixo.
A tabela INFORMATION_SCHEMA.SPANNER_STATISTICS
incorporada do Spanner contém uma lista de pacotes de estatísticas disponíveis. Cada linha desta tabela
apresenta um pacote de estatísticas por nome, e o nome contém a data/hora de criação
do pacote em questão. Cada entrada também contém um campo denominado ALLOW_GC
que define se um pacote pode ou não ser recolhido como lixo.
Pode fixar toda a sua base de dados a qualquer um dos pacotes indicados nessa tabela. O pacote de estatísticas fixado não é recolhido como lixo e o valor de ALLOW_GC
é ignorado enquanto a base de dados estiver fixada a este pacote. Para usar um pacote de estatísticas específico para uma consulta individual, o pacote tem de estar listado com ALLOW_GC=FALSE
ou fixado. Isto impede que as consultas falhem depois de o pacote de estatísticas ter sido recolhido como lixo. Pode alterar o valor de ALLOW_GC
através da declaração DDL do GoogleSQL ALTER STATISTICS
ou do PostgreSQL ALTER STATISTICS
.
Retenção de pacotes e informações de identificação pessoal (PII)
Um pacote de estatísticas contém histogramas dos dados das colunas, de acordo com a prática padrão da indústria. Isto ajuda o otimizador de consultas a selecionar os planos de consulta ideais. O histograma é criado com uma pequena amostra de valores. Este pequeno conjunto de dados pode conter potencialmente PII.
O Spanner cria um novo pacote de estatísticas regularmente e
mantém-no durante 30 dias por predefinição. Assim, uma pequena amostra de valores eliminados da base de dados pode ser retida durante mais 30 dias nos histogramas de estatísticas.
Os pacotes de estatísticas fixados com a opção de base de dados optimizer_statistics_package
ou os pacotes com a opção ALLOW_GC=FALSE
não são recolhidos como lixo.
Os histogramas nestes pacotes podem conter valores eliminados da base de dados durante um período mais longo. Além disso, o conteúdo dos pacotes de estatísticas está incluído nas cópias de segurança da base de dados.
As estatísticas do otimizador são armazenadas encriptadas da mesma forma que os dados do utilizador.
Normalmente, a quantidade total de armazenamento necessária para estes pacotes é inferior a 100 MB e é contabilizada nos seus custos de armazenamento totais.
O que se segue?
- Para saber mais sobre o histórico do otimizador de consultas, consulte o histórico de versões do otimizador de consultas.
- Para gerir a versão do otimizador e o pacote de estatísticas para o seu cenário, consulte o artigo Gerir o otimizador de consultas.