Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Cette page décrit et fournit l'historique des différentes versions de l'optimiseur de requêtes Spanner. La version par défaut actuelle est la version 7.
Pour en savoir plus sur l'optimiseur de requêtes, consultez À propos de l'optimiseur de requêtes.
Spanner déploie les mises à jour de l'optimiseur de requêtes en tant que nouvelles versions de l'optimiseur de requêtes. Par défaut, chaque base de données commence à utiliser la dernière version de l'optimiseur au plus tard 30 jours après sa publication.
Si vous utilisez une base de données en dialecte GoogleSQL, vous pouvez gérer la version de l'optimiseur de requêtes utilisée par vos requêtes. Avant de procéder au commit vers la dernière version, vous pouvez comparer les profils de performances des requêtes entre les anciennes versions et la dernière version. Pour en savoir plus, consultez la section Gérer l'optimiseur de requêtes.
Historique des versions de l'optimiseur de requête
Vous trouverez ci-dessous un récapitulatif des mises à jour apportées à l'optimiseur de requêtes dans chaque version.
Version 8: 28 octobre 2024 (dernière version)
Les clauses WITH sont prises en compte lorsque vous choisissez un plan basé sur les coûts.
Amélioration des performances des requêtes de jointure croisée distribuée et des requêtes de recherche indexées.
Amélioration de la réorganisation JOIN.
Amélioration des performances des requêtes avec de grandes clauses IN (...).
Amélioration des performances de GROUP BY dans certains cas.
Autres améliorations, y compris une gestion plus efficace des requêtes avec LIMIT, les clés étrangères et la sélection d'index.
Version 7: 22 mai 2024 (par défaut)
Ajout de la prise en charge de la sélection basée sur les coûts des plans d'union d'index.
Ajout de la prise en charge de la sélection intelligente des plans de recherche par rapport aux plans d'analyse en fonction des statistiques pour les requêtes qui ne comportent pas de prédicats de recherche pour toutes les parties de clé.
Ajout de la prise en charge de la sélection des jointures de hachage basée sur les coûts.
Version 6: 11 septembre 2023
Amélioration de la transmission des limites et des prédicats via des jointures externes complètes.
Amélioration de l'estimation de la cardinalité et du modèle de coût.
Activation de l'optimisation basée sur les coûts pour les requêtes DML.
Version 5: 15 juillet 2022
Modèle de coûts amélioré pour la sélection d'index, la gestion de la distribution, l'emplacement de tri et la sélection GROUP BY.
Prise en charge de la sélection de l'algorithme de jointure basé sur les coûts qui choisit entre la jointure par hachage et la jointure par application. La jointure de fusion nécessite toujours d'utiliser une indication de requête.
Ajout de la prise en charge de la commutativité des jointures basées sur les coûts.
Version 4: 1er mars 2022
Améliorations apportées à la sélection d'index secondaire.
Amélioration de l'utilisation de l'index secondaire dans une jointure entre des tables entrelacées.
Amélioration de l'utilisation des index secondaires de couverture.
Amélioration de la sélection d'index lorsque les statistiques de l'optimiseur sont obsolètes.
Privilégiez les index secondaires avec des prédicats sur les colonnes indexées principales, même si les statistiques de l'optimiseur ne sont pas disponibles ou si le rapport indique que la table de base est petite.
Introduction de la jointure de hachage en une seule passe, activée par la nouvelle indice hash_join_execution.
Le nombre d'exécutions sur l'enfant de droite de la jointure par hachage est supérieur au nombre d'exécutions sur l'opérateur de jointure par hachage.
La latence de l'enfant de droite de l'opérateur de jointure par hachage est également élevée.
Par défaut (hash_join_execution=multi_pass), si l'entrée du côté compilation de la jointure de hachage est trop volumineuse pour tenir en mémoire, le côté compilation est divisé en plusieurs lots et nous pouvons analyser le côté sonde plusieurs fois. Avec le nouveau mode (hash_join_execution=one_pass), une jointure de hachage est transférée sur le disque si son entrée côté compilation ne peut pas tenir en mémoire et n'analyse jamais le côté sonde qu'une seule fois.
Amélioration de la sélection du nombre de touches utilisées pour la recherche.
Version 3: 1er août 2021
Ajoute un nouvel algorithme de jointure (jointure par fusion) activé à l'aide d'une nouvelle valeur d'optimisation de requête JOIN METHOD.
Introduit l'opérateur union de fusion distribuée, qui est activé par défaut le cas échéant. Cette opération améliore les performances des requêtes.
Légère amélioration des performances d'une analyse sous un opérateur GROUP BY lorsqu'il n'y a pas d'agrégation MAX ou MIN (ou HAVING MAX/MAX) dans la liste SELECT.
Avant cette modification, Spanner charge la colonne supplémentaire non regroupée même si elle n'est pas requise par la requête.
Avant cette modification, la requête suivante aurait chargé la colonne c, même si elle n'est pas requise par la requête.
SELECTa,bFROMmyTableGROUPBYa,b
Améliore les performances de certaines requêtes avec LIMIT lorsqu'un opérateur CrossApply est introduit par des jointures et que la requête demande des résultats triés avec LIMIT. Après cette modification, l'optimiseur applique d'abord le tri avec la limite du côté d'entrée de CrossApply.
Améliore les performances des requêtes en envoyant davantage de calculs via JOIN.
Transmet plus de calculs pouvant inclure une sous-requête ou une construction de structure via une jointure. Cela améliore les performances des requêtes de plusieurs manières : plus de calculs peuvent être effectués de manière distribuée et plus d'opérations dépendantes des calculs push peuvent être transférées. Par exemple, la requête a une limite et l'ordre de tri dépend de ces calculs. Dans ce cas, la limite peut également être transmise via une jointure.
Ajoute des optimisations dans la sélection d'index.
Améliore les performances des prédicats REGEXP_CONTAINS et LIKE dans certaines circonstances.
Améliore les performances d'une analyse sous un prédicat GROUP BY dans certains cas.
Version 1 : 18 juin 2019
Inclut de nombreuses optimisations basées sur des règles, telles que le pushdown de prédicat, le pushdown de limite, la jointure redondante et la suppression d'expressions redondantes.
Utilise les statistiques de données utilisateur pour sélectionner l'index à utiliser pour accéder à chaque table.
Pour gérer à la fois la version de l'optimiseur et le package de statistiques pour votre scénario, consultez la page Gérer l'optimiseur de requêtes.
Sauf indication contraire, le contenu de cette page est régi par une licence Creative Commons Attribution 4.0, et les échantillons de code sont régis par une licence Apache 2.0. Pour en savoir plus, consultez les Règles du site Google Developers. Java est une marque déposée d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/09/05 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Difficile à comprendre","hardToUnderstand","thumb-down"],["Informations ou exemple de code incorrects","incorrectInformationOrSampleCode","thumb-down"],["Il n'y a pas l'information/les exemples dont j'ai besoin","missingTheInformationSamplesINeed","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/09/05 (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)."]]