Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
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 WITH sã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 BY em 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.
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.
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 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.
Antes dessa alteração, a consulta a seguir carregava a coluna c, embora
não seja exigida pela consulta.
SELECTa,bFROMmyTableGROUPBYa,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 primeiro aplica a classificação
com o limite na entrada da aplicação cruzada.
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.
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.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Difícil de entender","hardToUnderstand","thumb-down"],["Informações incorretas ou exemplo de código","incorrectInformationOrSampleCode","thumb-down"],["Não contém as informações/amostras de que eu preciso","missingTheInformationSamplesINeed","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-08-11 UTC."],[],[],null,["# Spanner query optimizer versions\n\nThis page describes and provides a history of the various Spanner query\noptimizer versions. The current default version is 7.\nTo learn more about the query optimizer, see [About query optimizer](/spanner/docs/query-optimizer/overview).\n\nSpanner rolls out query optimizer updates as new query\noptimizer versions. By default, each database starts using the latest version of\nthe optimizer no sooner than 30 days after that version has been released.\n\nIf you're using a GoogleSQL-dialect database, you can manage the query optimizer version\nthat your queries use. Before committing to the latest version, you can compare\nquery performance profiles between earlier versions and the latest version. To\nlearn more, see [Manage the query optimizer](/spanner/docs/query-optimizer/manage-query-optimizer).\n\nQuery optimizer version history\n-------------------------------\n\nThe following is a summary of the updates made to the query optimizer in each\nrelease.\n\n\u003cbr /\u003e\n\n### Version 8: October 28th, 2024 (latest)\n\n- `WITH` clauses are considered when making cost-based plan choices.\n\n- Improved performance of distributed cross apply and indexed lookup queries.\n\n- Improved `JOIN` reordering.\n\n- Improved performance of queries with large `IN (...)` clauses.\n\n- Improved `GROUP BY` performance in certain cases.\n\n- Other improvements including more efficient handling of queries with `LIMIT`,\n foreign keys, and index selection.\n\n### Version 7: May 22nd, 2024 (default)\n\n- Added support for cost-based selection of index union plans.\n\n- Added support for the smart selection of seek versus scan plans based on\n statistics for queries that don't have seekable predicates for all key parts.\n\n- Added support for cost-based selection of hash joins.\n\n### Version 6: September 11th, 2023\n\n- Improved limit pushing and predicate pushing through full outer joins.\n\n- Improved cardinality estimation and cost model.\n\n- Enabled cost-based optimization for DML queries.\n\n### Version 5: July 15th, 2022\n\n- Improved cost model for index selection, distribution management, sort\n placement and `GROUP BY` selection.\n\n- Added support for cost-based join algorithm selection that chooses between\n hash and apply join. Merge join still requires using a query hint.\n\n- Added support for cost-based join commutativity.\n\n### Version 4: March 1st, 2022\n\n- Improvements to secondary index selection.\n\n - Improved secondary index usage under a join between interleaved tables.\n - Improved covering secondary index usage.\n - Improved index selection when optimizer statistics are outdated.\n - Prefer secondary indexes with predicates on leading indexed columns even if the optimizer statistics are not available or report the base table is small.\n- Introduces single pass hash join, enabled by the new hint\n `hash_join_execution`.\n\n Join Hint: \n\n ### GoogleSQL\n\n SELECT ...\n FROM (...)\n JOIN@{join_method=hash_join, hash_join_execution=one_pass} (...)\n\n ### PostgreSQL\n\n SELECT ...\n FROM (...)\n JOIN/*@ join_method=hash_join, hash_join_execution=one_pass */ (...)\n\n The new mode is beneficial when the [build side input of the hash join](/spanner/docs/query-execution-operators#hash-join)\n is large. One pass hash join is expected to have better performance when you\n observe the following in the [query execution profile](/spanner/docs/tune-query-with-visualizer):\n - The number of executions on the right child of the hash join is larger than the number of executions on the hash join operator.\n - The latency on the right child of the hash join operator is also high.\n\n By default (`hash_join_execution=multi_pass`), if the build side input of\n the hash join is too large to fit in memory, the build side is split into\n multiple batches and we might scan the probe side multiple times. With the\n new mode (`hash_join_execution=one_pass`), a hash join will spill to disk if\n its build side input cannot fit in memory and will always scan the probe\n side only once.\n- An improvement in selecting how many keys are used for seeking.\n\n### Version 3: August 1st, 2021\n\n- Adds a new join algorithm, merge join, enabled using a new [JOIN METHOD](/spanner/docs/reference/standard-sql/query-syntax#join-methods)\n query hint value.\n\n Statement hint: \n\n ### GoogleSQL\n\n @{join_method=merge_join}\n SELECT ...\n\n ### PostgreSQL\n\n /*@ join_method=merge_join */\n SELECT ...\n\n Join hint: \n\n ### GoogleSQL\n\n SELECT ...\n FROM (...)\n JOIN@{join_method=merge_join} (...)\n\n ### PostgreSQL\n\n SELECT ...\n FROM (...)\n JOIN/*@ join_method=merge_join */ (...)\n\n- Adds a new join algorithm, push broadcast hash join, enabled using a new\n [JOIN METHOD](/spanner/docs/reference/standard-sql/query-syntax#join-methods) query hint value.\n\n Join hint: \n\n ### GoogleSQL\n\n SELECT ...\n FROM (...)\n JOIN@{join_method=push_broadcast_hash_join} (...)\n\n ### PostgreSQL\n\n SELECT ...\n FROM (...)\n JOIN/*@ join_method=push_broadcast_hash_join} */ (...)\n\n- Introduces the [distributed merge union](/spanner/docs/query-execution-operators#distributed-merge-union)\n operator, which is enabled by default when applicable. This operation\n improves the performance of queries.\n\n- A small improvement to the performance of a scan under a `GROUP BY` when\n there is no MAX or MIN aggregate (or HAVING MAX/MAX) in the SELECT list.\n Prior to this change, Spanner loaded the extra non-grouped\n column even if it was not required by the query.\n\n For example, consider the following table: \n\n ### GoogleSQL\n\n CREATE TABLE myTable(\n a INT64,\n b INT64,\n c INT64,\n d INT64)\n PRIMARY KEY (a, b, c);\n\n ### PostgreSQL\n\n CREATE TABLE myTable(\n a bigint,\n b bigint,\n c bigint,\n d bigint,\n PRIMARY KEY(a, b, c)\n );\n\n Prior to this change, the following query would have loaded column `c` even\n though it is not required by the query. \n\n SELECT a, b\n FROM myTable\n GROUP BY a, b\n\n- Improves the performance of some queries with `LIMIT` when there is a\n cross apply operator introduced by joins and the query asks for sorted\n results with LIMIT. After this change, the optimizer applies the sorting\n with the limit on the input side of cross apply first.\n\n Example: \n\n ### GoogleSQL\n\n SELECT a2.*\n FROM Albums@{FORCE_INDEX=_BASE_TABLE} a1\n JOIN Albums@{FORCE_INDEX=_BASE_TABLE} a2 USING(SingerId)\n ORDER BY a1.AlbumId\n LIMIT 2;\n\n ### PostgreSQL\n\n SELECT a2.*\n FROM albums/*@ force_index=_base_table */ a1\n JOIN albums/*@ force_index=_base_table */ a2 USING(singerid)\n ORDER BY a1.albumid\n LIMIT 2;\n\n- Improves query performance by pushing more computations through `JOIN`.\n\n Pushes more computations which may include a subquery or struct construction\n through join. That improves the query performance in a few ways such as:\n More computations can be done in a distributed fashion and more operations\n that depend on the pushed computations can be pushed down as well. For\n example, the query has a limit and the sort order depends on those\n computations, then the limit can be pushed through join as well.\n\n Example: \n\n SELECT\n t.ConcertDate,\n (\n SELECT COUNT(*) FROM UNNEST(t.TicketPrices) p WHERE p \u003e 10\n ) AS expensive_tickets,\n u.VenueName\n FROM Concerts t\n JOIN Venues u ON t.VenueId = u.VenueId\n ORDER BY expensive_tickets\n LIMIT 2;\n\n\u003cbr /\u003e\n\n### Version 2: March 1st, 2020\n\n- Adds optimizations in index selection.\n- Improves the performance of `REGEXP_CONTAINS` and `LIKE` predicates under certain circumstances.\n- Improves the performance of a scan under a `GROUP BY` in certain situations.\n\n\u003cbr /\u003e\n\n### Version 1: June 18th, 2019\n\n- Includes many rule based optimizations such as predicate pushdown, limit\n pushdown, redundant join and redundant expression removal, to name a few.\n\n- Uses statistics on user data to select which index to use to access each\n table.\n\nWhat's next\n-----------\n\n- To learn more about the query optimizer, see [About query optimizer](/spanner/docs/query-optimizer/overview).\n- To manage both the optimizer version and statistics package for your scenario, see [Manage the query optimizer](/spanner/docs/query-optimizer/manage-query-optimizer)."]]