Esta página descreve e fornece um histórico das várias versões do otimizador de consultas do Spanner. A versão padrão atual é a 8. Para saber mais sobre o otimizador de consultas, consulte Visão geral do otimizador de consultas.
O Spanner implementa as atualizações do otimizador de consultas como novas versões do otimizador de consultas. Por padrão, cada banco de dados começa a usar a versão mais recente do otimizador até 30 dias após o lançamento dessa versão.
É possível gerenciar a versão do otimizador de consultas que suas consultas usam para bancos de dados com dialeto GoogleSQL e PostgreSQL. Antes de se comprometer com a versão mais recente, você pode comparar perfis de desempenho de consulta entre versões mais antigas e mais recentes. Para saber mais, consulte Gerenciar o otimizador de consultas.
Histórico de versões do otimizador de consultas
Veja a seguir um resumo das atualizações feitas no otimizador de consultas em cada versão.
Versão 9: 21 de julho de 2026 (mais recente)
Melhora a eficiência das junções de aplicação distribuída (DA, na sigla em inglês) enviando apenas as colunas necessárias da entrada para o lado do mapa da junção.
Seleciona automaticamente os índices em colunas calculadas quando a mesma expressão calculada é um filtro ou condição de junção em uma consulta.
Por exemplo, permite a seleção do índice em
Singers((LOWER(FirstName)))se presente para a seguinte consulta:GoogleSQL
SELECT s.SingerId, s.FirstName, s.LastName FROM Singers s WHERE LOWER(s.FirstName) > 'k' LIMIT 10;PostgreSQL
SELECT s.singerid, s.firstname, s.lastname FROM singers s WHERE LOWER(s.firstname) > 'k' LIMIT 10;Melhora a performance de pesquisa de índice intercalado agrupando e classificando chaves para pesquisas sequenciais eficientes no armazenamento.
Pequenas melhorias na estimativa de cardinalidade.
Prefere heuristicamente planos com aplicação distribuída em vez de aplicação com união distribuída no lado do mapa se não houver
LIMITacima da aplicação.Escolhe planos de união de índice de forma mais agressiva.
Melhora a performance de
GROUP BYexpandindo a agregação baseada em verificação para oferecer suporte a predicados de filtro em que a chave de agregação é comparada a funções que envolvem constantes e parâmetros.Permite a otimização de planos baseada em custos para consultas que envolvem tabelas com esquemas nomeados.
Versão 8: 28 de outubro de 2024 (padrão)
As cláusulas
WITHsão consideradas ao fazer escolhas de planos baseadas em custos.Melhoria na performance de consultas de aplicação cruzada distribuída e pesquisa indexada.
Melhoria na reordenação de
JOIN.Melhoria na performance de consultas com cláusulas
IN (...)grandes.Melhoria na performance de
GROUP BYem determinados casos.Outras melhorias, incluindo o processamento mais eficiente de consultas com
LIMIT, chaves estrangeiras e seleção de índice.
Versão 7: 22 de maio de 2024
Adição de suporte para seleção baseada em custos de planos de união de índice.
Adição de suporte para a seleção inteligente de planos de pesquisa versus verificação com base em estatísticas para consultas que não têm predicados pesquisáveis para todas as partes principais.
Adição de suporte para seleção baseada em custos de junções de hash.
Versão 6: 11 de setembro de 2023
Melhoria no pushdown de limite e no pushdown de predicado por junções externas completas.
Melhoria na estimativa de cardinalidade e no modelo de custo.
Otimização baseada em custos ativada para consultas DML.
Versão 5: 15 de julho de 2022
Melhoria no modelo de custo para seleção de índice, gerenciamento de distribuição, posicionamento de classificação e seleção de
GROUP BY.Adição de suporte para seleção de algoritmo de junção baseada em custos que escolhe entre hash e junção de aplicação. A junção de mesclagem ainda exige o uso de uma dica de consulta.
Adição de suporte para comutatividade de junção baseada em custos.
Versão 4: 1º de março de 2022
Melhorias na seleção de índice secundário.
- Melhoria no uso de índice secundário em uma junção entre tabelas intercaladas.
- Melhoria no uso de índice secundário de cobertura.
- Melhoria na seleção de índice quando as estatísticas do otimizador estão desatualizadas.
- Prefira índices secundários com predicados em colunas indexadas principais, mesmo que as estatísticas do otimizador não estejam disponíveis ou informem que a tabela base é pequena.
Introduz a junção de hash de passagem única, ativada pela nova dica
hash_join_execution.Dica de junção:
GoogleSQL
SELECT ... FROM (...) JOIN@{join_method=hash_join, hash_join_execution=one_pass} (...)PostgreSQL
SELECT ... FROM (...) JOIN/*@ join_method=hash_join, hash_join_execution=one_pass */ (...)O novo modo é útil quando a entrada do lado de build da junção de hash é grande. Espera-se que a junção de hash de passagem única tenha melhor performance quando você observar o seguinte no perfil de execução da consulta:
- O número de execuções no filho à direita da junção de hash é maior que o número de execuções no operador de junção de hash.
- A latência no filho à direita do operador de junção de hash também é alta.
Por padrão (
hash_join_execution=multi_pass), se a entrada do lado de build da junção de hash for muito grande para caber na memória, o lado de build será dividido em vários lotes, e poderemos verificar o lado da sonda várias vezes. Com o novo modo (hash_join_execution=one_pass), uma junção de hash será derramada no disco se a entrada do lado de build não couber na memória e sempre verificará o lado da sonda apenas uma vez.Uma melhoria na seleção de quantas chaves são usadas para pesquisa.
Versão 3: 1º de agosto de 2021
Adiciona um novo algoritmo de mesclagem, merge join, ativado usando um novo JOIN METHOD valor de dica de consulta.
Dica de instrução:
GoogleSQL
@{join_method=merge_join} SELECT ...PostgreSQL
/*@ join_method=merge_join */ SELECT ...Dica de junção:
GoogleSQL
SELECT ... FROM (...) JOIN@{join_method=merge_join} (...)PostgreSQL
SELECT ... FROM (...) JOIN/*@ join_method=merge_join */ (...)Adiciona um novo algoritmo de mesclagem, push broadcast hash join, ativado usando um novo JOIN METHOD valor de dica de consulta.
Dica de junção:
GoogleSQL
SELECT ... FROM (...) JOIN@{join_method=push_broadcast_hash_join} (...)PostgreSQL
SELECT ... FROM (...) JOIN/*@ join_method=push_broadcast_hash_join} */ (...)Introduz o operador de união de mesclagem distribuída, que é ativado por padrão quando aplicável. Essa operação melhora a performance das consultas.
Uma pequena melhoria no desempenho de uma verificação em um
GROUP BYquando não há agregação MAX ou MIN (ou HAVING MAX/MAX) na lista SELECT. Antes dessa alteração, o Spanner carregava a coluna extra não agrupada, mesmo que ela não fosse exigida pela consulta.Por exemplo, considere a seguinte tabela:
GoogleSQL
CREATE TABLE myTable( a INT64, b INT64, c INT64, d INT64) PRIMARY KEY (a, b, c);PostgreSQL
CREATE TABLE myTable( a bigint, b bigint, c bigint, d bigint, PRIMARY KEY(a, b, c) );Antes dessa alteração, a consulta a seguir carregava a coluna
c, embora não seja exigida pela consulta.SELECT a, b FROM myTable GROUP BY a, bMelhora o desempenho de algumas consultas com
LIMITquando há um operador de aplicação cruzada introduzido por junções e a consulta solicita resultados classificados com LIMIT. Após essa alteração, o otimizador primeiro aplica a classificação com o limite na entrada da aplicação cruzada.Exemplo:
GoogleSQL
SELECT a2.* FROM Albums@{FORCE_INDEX=_BASE_TABLE} a1 JOIN Albums@{FORCE_INDEX=_BASE_TABLE} a2 USING(SingerId) ORDER BY a1.AlbumId LIMIT 2;PostgreSQL
SELECT a2.* FROM albums/*@ force_index=_base_table */ a1 JOIN albums/*@ force_index=_base_table */ a2 USING(singerid) ORDER BY a1.albumid LIMIT 2;Melhora o desempenho da consulta enviando mais cálculos pelo
JOIN.Envia mais cálculos que podem incluir uma subconsulta ou construção de estrutura por meio da mesclagem. Isso melhora o desempenho da consulta de algumas maneiras, como: mais cálculos podem ser feitos de maneira distribuída e mais operações que dependem dos cálculos enviados também podem ser enviadas. Por exemplo, a consulta tem um limite e a ordem de classificação depende desses cálculos, então o limite também pode ser enviado por meio de mesclagem.
Exemplo:
SELECT t.ConcertDate, ( SELECT COUNT(*) FROM UNNEST(t.TicketPrices) p WHERE p > 10 ) AS expensive_tickets, u.VenueName FROM Concerts t JOIN Venues u ON t.VenueId = u.VenueId ORDER BY expensive_tickets LIMIT 2;
Versão 2: 1º de março de 2020
- Adiciona otimizações na seleção do índice.
- Melhora o desempenho dos predicados
REGEXP_CONTAINSeLIKEem determinadas circunstâncias. - Melhora o desempenho de uma verificação em um
GROUP BYem determinadas situações.
Versão 1: 18 de junho de 2019
Inclui muitas otimizações baseadas em regras, como pushdown de predicado, pushdown de limite, junção redundante e remoção de expressão redundante, para citar alguns.
Usa estatísticas nos dados do usuário para selecionar qual índice usar para acessar cada tabela.
A seguir
- Para saber mais sobre o otimizador de consultas, consulte Sobre o otimizador de consultas.
- Para gerenciar a versão do otimizador e o pacote de estatísticas do seu cenário, consulte Gerenciar o otimizador de consultas.