Cette page décrit l'optimiseur de requêtes Spanner et ses avantages. L'optimiseur de requêtes est disponible pour les bases de données en dialecte GoogleSQL et en dialecte PostgreSQL.
Présentation
L'optimiseur de requête SQL de Spanner convertit une instruction SQL déclarative, qui décrit les données interrogées par la requête, en un plan d'exécution impératif, qui décrit une manière d'obtenir précisément ces données. Le processus de transformation d'une instruction déclarative en un plan d'exécution de requête implique la transformation des structures d'arbres utilisées pour représenter la requête. L'optimiseur, au cours de la création d'un plan d'exécution, conserve la signification logique de la requête SQL d'origine afin de renvoyer les lignes correctes.
L'un des rôles importants de l'optimiseur est de concevoir un plan d'exécution efficace.
Comment l'optimiseur Spanner génère-t-il des plans d'exécution efficaces ?
L'optimiseur de Spanner utilise une combinaison d'heuristiques bien établies et d'optimisation des coûts pour produire des plans efficaces. Certaines heuristiques sont très simples, comme "appliquer les filtres sur les machines distantes plutôt que d'extraire des données sur la machine locale". D'autres heuristiques sont plus complexes, mais incarnent tout de même le principe de logique de déplacement visant à réduire le volume des données à proximité des données. Ce principe est particulièrement important dans un système qui répartit les données sur plusieurs machines.
Toutes les décisions d'exécution ne pouvant pas être prises efficacement en utilisant ces règles fixes, l'optimiseur de Spanner prend également des décisions basées sur le coût estimé des alternatives. Ces estimations de coûts sont calculées en utilisant la structure de la requête, le schéma de base de données et les estimations de volume de données produit par des fragments de la requête. Par exemple, Spanner estime le nombre de lignes de la table "Songs" qui correspondent au filtre SongGenre = "Country"
, si ce filtre apparaît dans une requête. Pour faciliter le calcul de ces estimations, Spanner recueille régulièrement des statistiques pour caractériser la distribution des données dans une base de données.
De plus, Spanner optimise l'exécution des requêtes en déterminant automatiquement si une méthode de traitement orientée ligne ou colonne doit être utilisée pour la requête. Pour en savoir plus, consultez la section Optimiser les analyses.
Pour en savoir plus sur les plans d'exécution de requêtes et leur utilisation par Spanner afin d'exécuter des requêtes dans un environnement distribué, consultez la page Plans d'exécution de requêtes.
Gestion des versions de l'optimiseur de requêtes
Au fil du temps, l'optimiseur de requêtes Spanner évoluera, élargissant la gamme de choix dans le plan d'exécution de requêtes et améliorant la précision des estimations qui informent ces choix, ce qui améliorera l'efficacité des plans d'exécution.
Spanner publie des mises à jour de l'optimiseur en tant que nouvelles versions de l'optimiseur de requêtes pour améliorer l'efficacité de ses plans d'exécution de requêtes. Pour en savoir plus sur les différentes versions, consultez la section Versions de l'optimiseur de requêtes Spanner.
Packages de statistiques de l'optimiseur de requêtes
Spanner conserve des statistiques sur la distribution des données des colonnes de table afin d'estimer le nombre de lignes générées par une requête. L'optimiseur de requêtes utilise ces estimations pour vous aider à choisir le meilleur plan d'exécution de requêtes. Ces statistiques sont régulièrement mises à jour par Spanner. Étant donné que les statistiques sont utilisées pour choisir les plans d'exécution de requêtes, il est possible que Spanner modifie le plan de requête utilisé pour une requête lorsque les statistiques sont mises à jour.
Par défaut, les bases de données utilisent automatiquement le dernier package de statistiques généré. Vous pouvez épingler une version de package de statistiques antérieure pour forcer votre base de données à l'utiliser. Vous avez également la possibilité d'exécuter des requêtes individuelles avec un package de statistiques autre que le plus récent.
Créer un package de statistiques
Spanner génère automatiquement un nouveau package de statistiques tous les trois jours. Pour créer manuellement un package de statistiques, utilisez l'instruction DDL ANALYZE
de Google SQL ou l'instruction DDL ANALYZE
de PostgreSQL.
Après avoir apporté des modifications importantes aux données ou au schéma de votre base de données, la création d'un nouveau package d'informations statistiques peut améliorer les performances des requêtes. Il est recommandé de créer un nouveau package de statistiques si les conditions suivantes sont remplies:
- La base de données traite un grand nombre d'insertions, de mises à jour ou de suppressions.
- Vous ajoutez un indice à la base de données.
- Vous ajoutez une colonne à une table.
L'exécution d'une instruction DDL ANALYZE
met à jour votre schéma, lance une opération de longue durée et annule la création de toute statistique déclenchée automatiquement.
Une fois que Spanner a terminé d'exécuter l'instruction, l'optimiseur de requêtes met jusqu'à dix minutes à prendre en compte un nouveau package de statistiques dans sa planification de requêtes.
Récupération de mémoire dans les packages de statistiques
Les packages de statistiques dans Spanner sont conservés pendant 30 jours après leur création, après quoi ils sont soumis à la récupération de mémoire.
La table intégrée INFORMATION_SCHEMA.SPANNER_STATISTICS
de Spanner contient une liste des packages de statistiques disponibles. Chaque ligne de ce tableau répertorie un package de statistiques par nom, et le nom contient l'horodatage de création du package. Chaque entrée contient également un champ appelé ALLOW_GC
qui indique si un package peut faire l'objet d'une récupération de mémoire ou non.
Vous pouvez épingler l'un des packages répertoriés dans cette table pour forcer l'ensemble de votre base de données à l'utiliser. Le package de statistiques choisi ne fait pas l'objet d'une récupération de mémoire et la valeur de ALLOW_GC
est ignorée tant que la base de données utilise ce package épinglé. Afin d'utiliser un package de statistiques particulier pour une requête individuelle, le package en question doit être répertorié avec ALLOW_GC=FALSE
ou épinglé. Vous éviterez ainsi l'échec des requêtes après la récupération de mémoire du package de statistiques. Vous pouvez modifier la valeur de ALLOW_GC
à l'aide de l'instruction LDD GoogleSQL ALTER STATISTICS
ou PostgreSQL ALTER STATISTICS
.
Conservation des packages et informations permettant d'identifier personnellement l'utilisateur
Un package de statistiques contient des histogrammes des données de colonne, conformément aux pratiques standards de l'industrie. Cela permet à l'optimiseur de requêtes de sélectionner les plans de requête optimaux. L'histogramme est construit à l'aide d'un petit échantillon de valeurs. Ce petit ensemble de données peut contenir des informations personnelles.
Spanner crée régulièrement un nouveau package de statistiques et le conserve pendant 30 jours par défaut. Ainsi, un petit échantillon des valeurs supprimées de la base de données peut être conservé pendant 30 jours supplémentaires dans les histogrammes de statistiques.
Les packages de statistiques épinglés avec l'option de base de données optimizer_statistics_package
ou les packages avec l'option ALLOW_GC=FALSE
ne font pas l'objet d'une récupération de mémoire.
Les histogrammes de ces packages peuvent contenir des valeurs supprimées de la base de données pendant une période plus longue. De plus, le contenu des packages de statistiques est inclus dans les sauvegardes de base de données.
Les statistiques de l'optimiseur sont stockées de la même manière que les données utilisateur.
La quantité totale d'espace de stockage requise pour ces packages est généralement inférieure à 100 Mo et est comptabilisée dans votre coût total de stockage.
Étape suivante
- Pour en savoir plus sur l'historique de l'optimiseur de requêtes, consultez l'article Historique des versions de l'optimiseur de requêtes.
- 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.