Versões do otimizador de consultas do Spanner

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 WITH sã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 JOIN aprimorada.

  • Melhoria na performance de consultas com cláusulas IN (...) grandes.

  • Melhoria na performance do GROUP BY em 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 BY quando 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 LIMIT quando 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_CONTAINS e LIKE em determinadas circunstâncias.
  • Aprimora o desempenho de uma verificação em um GROUP BY em 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