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 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 depois do lançamento dessa versão.
É possível gerenciar a versão do otimizador de consultas que suas consultas usam para bancos de dados do dialeto GoogleSQL e do dialeto PostgreSQL. Antes de se comprometer com a versão mais recente, você pode comparar perfis de desempenho de consulta entre versões anteriores e a 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 (padrão e mais recente)
As cláusulas
WITHsão consideradas ao fazer escolhas de planos com base em custos.Melhoria na performance de consultas distribuídas de junção cruzada e de pesquisa indexada.
Reordenação
JOINaprimorada.Melhoria na performance de consultas com cláusulas
IN (...)grandes.Melhoria na performance do
GROUP BYem alguns casos.Outras melhorias, incluindo um 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 de planos de união de índice com base no custo.
Adicionamos suporte à seleção inteligente de planos de busca e verificação com base em estatísticas de consultas que não têm predicados pesquisáveis para todas as partes principais.
Adicionamos suporte para seleção de junções de hash com base em custo.
Versão 6: 11 de setembro de 2023
Melhoria no envio de limites e de predicados com junções externas completas.
Melhoria na estimativa de cardinalidade e no modelo de custo.
Ativamos a otimização baseada em custos para consultas DML.
Versão 5: 15 de julho de 2022
Modelo de custo aprimorado para seleção de índice, gerenciamento de distribuição, posicionamento de classificação e seleção de
GROUP BY.Adicionamos suporte para a seleção de algoritmo de junção baseada em custo, que escolhe entre hash e aplicar junção. A junção de mesclagem ainda exige o uso de uma dica de consulta.
Adicionamos suporte à 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 de índices secundários em uma junção entre tabelas intercaladas.
- Melhoria no uso de índices secundários de cobertura.
- Melhoria na seleção de índices quando as estatísticas do otimizador estão desatualizadas.
- Prefira índices secundários com predicados nas principais colunas indexadas, mesmo que as estatísticas do otimizador não estejam disponíveis ou informem que a tabela de base é pequena.
Apresenta a junção hash de passagem única, 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 é útil quando a entrada do lado de criação da junção de hash é grande. Espera-se que uma junção de hash de uma passagem tenha melhor desempenho quando você observar o seguinte no perfil de execução da consulta:
- O número de execuções no filho à direita da junção hash é maior que o número de execuções no operador de junção hash.
- A latência no filho à direita do operador de junção hash também é alta.
Por padrão (
hash_join_execution=multi_pass), se a entrada do lado da criação da junção de hash for muito grande para caber na memória, o lado da criação será dividido em vários lotes, e poderemos verificar o lado da sondagem várias vezes. Com o novo modo (hash_join_execution=one_pass), uma junção de hash será gravada em disco se a entrada do lado de build não couber na memória e sempre vai verificar o lado de sondagem apenas uma vez.Melhoria na seleção de quantas chaves são usadas para 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 distributed merge union, 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, 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 mudança, o otimizador aplica a classificação com o limite na entrada do CrossApply primeiro.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. - 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.