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 7. Para saber mais sobre o otimizador de consultas, consulte Sobre o otimizador de consultas.
O Spanner lança 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.
Se você estiver usando um banco de dados de dialeto do GoogleSQL, poderá gerenciar a versão do otimizador de consultas usada pelas consultas. Antes de se comprometer com a versão mais recente, você pode comparar perfis de desempenho de consulta entre versões anteriores e a versão mais recente. 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 8: 28 de outubro de 2024 (mais recente)
- As cláusulas - WITHsão consideradas ao fazer escolhas de planos com base em custos.
- Melhoria no desempenho de consultas de pesquisa indexadas e de aplicação cruzada distribuída. 
- Melhoria na reordenação de - JOIN.
- Melhoria no desempenho de consultas com cláusulas - IN (...)grandes.
- Melhoria no desempenho de - GROUP BYem determinados casos.
- Outras melhorias incluem o processamento mais eficiente de consultas com - LIMIT, chaves estrangeiras e seleção de índice.
Versão 7: 22 de maio de 2024 (padrão)
- Adição de suporte à seleção de planos de união de índices com base no custo. 
- Adicionamos suporte à seleção inteligente de planos de busca e de verificação com base em estatísticas para consultas que não têm predicados de busca para todas as partes-chave. 
- Adição de suporte para a seleção baseada em custo de operações "hash join". 
Versão 6: 11 de setembro de 2023
- Melhoria na transmissão de limite e de predicado com junções externas completas. 
- Melhoria na estimativa de cardinalidade e no modelo de custo. 
- A otimização baseada em custos foi 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 à seleção de algoritmos de mesclagem com base em custos que escolhe entre hash e mesclagem de aplicação. A mesclagem ainda exige o uso de uma sugestão de consulta. 
- Inclusão de suporte para a comutatividade de junção baseada em custo. 
Versão 4: 1º de março de 2022
- Melhorias na seleção de índices secundários. - Melhoria no uso do índice secundário em uma mesclagem entre tabelas intercaladas.
- Melhoria no uso do índice secundário de cobertura.
- Melhoria na seleção de índices quando as estatísticas do otimizador estão desatualizadas.
- Dê preferência a índices secundários com predicados em colunas indexadas principais, mesmo se as estatísticas do otimizador não estiverem disponíveis ou se a tabela base for pequena.
 
- Apresenta a mesclagem de hash de uma única passagem, ativada pela nova dica - hash_join_execution.- Dica de mesclagem: - 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 é benéfico quando a entrada do lado de build da junção de hash é grande. A junção de hash de uma passagem terá um desempenho melhor quando você observar o seguinte no perfil de execução de consulta: - O número de execuções na criança à direita da união de hash é maior do que o número de execuções no operador de união de hash.
- A latência no filho à direita do operador de mesclagem de hash também é alta.
 - Por padrão ( - hash_join_execution=multi_pass), se a entrada do lado do build da junção de hash for muito grande para caber na memória, o lado do build será dividido em vários lotes, e podemos 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 do build não couber na memória e sempre verificará o lado da sondagem apenas uma vez.
- Melhoria na seleção de quantas chaves são usadas para a busca. 
Versão 3: 1º de agosto de 2021
- Adiciona um novo algoritmo de mesclagem, merge join, ativado usando um novo valor de dica de consulta JOIN METHOD. - 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 valor de dica de consulta JOIN METHOD. - Dica de junção: - GoogleSQL- SELECT ... FROM (...) JOIN@{join_method=push_broadcast_hash_join} (...)- PostgreSQL- SELECT ... FROM (...) JOIN/*@ join_method=push_broadcast_hash_join} */ (...)
- Apresenta o operador union de mesclagem distribuída, que é ativado por padrão quando aplicável. Essa operação melhora o desempenho 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 mudança, o Spanner carregava a coluna extra não agrupada, mesmo que ela não fosse exigida pela consulta.- Por exemplo, considere a tabela a seguir: - 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, b
- Melhora 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 mudança, 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. 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.
- Aprimora 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.