Régler une requête à l'aide du visualiseur du plan de requête

L'outil de visualisation de plans de requête vous permet de comprendre rapidement la structure du plan de requête choisi par Spanner pour évaluer une requête. Ce guide explique comment utiliser un plan de requête pour vous aider à comprendre l'exécution de vos requêtes.

Avant de commencer

Pour vous familiariser avec les fonctionnalités de la console Google Cloud mentionnées dans ce guide, lisez ce qui suit:

Exécuter une requête dans la console Google Cloud

  1. Accédez à la page Instances de Spanner dans la console Google Cloud.

    Accéder à la page Instances

  2. Sélectionnez le nom de l'instance contenant la base de données que vous souhaitez interroger.

    La console Google Cloud affiche la page Présentation de l'instance.

  3. Sélectionnez le nom de la base de données que vous souhaitez interroger.

    La console Google Cloud affiche la page Présentation de la base de données.

  4. Dans le menu latéral, cliquez sur Spanner Studio.

    La console Google Cloud affiche la page Spanner Studio de la base de données.

  5. Saisissez la requête SQL dans le volet de l'éditeur.
  6. Cliquez sur Exécuter.

    Spanner exécute la requête.

  7. Cliquez sur l'onglet Explication pour afficher la visualisation du plan de requête.

Visite guidée de l'éditeur de requête

La page Spanner Studio fournit des onglets de requête qui vous permettent de saisir ou coller des requêtes SQL et des instructions LMD, les exécuter sur votre base de données, et afficher leurs résultats et les plans d'exécution des requêtes. Les composants clés Les pages Spanner Studio sont numérotées dans la capture d'écran suivante.

Page de requête annotée.
Figure 7. Page de requête annotée.
  1. La barre d'onglets affiche les onglets de requête que vous avez ouverts. Pour créer un onglet, cliquez sur Nouvel onglet.

    La barre d'onglets fournit également une liste de Modèles de requêtes que vous pouvez utiliser pour coller des requêtes fournissant des insights sur les requêtes, transactions, lectures, etc. de base de données, comme décrit dans Présentation des outils d'introspection.

  2. La barre de commandes de l'éditeur propose les options suivantes :
    • La commande Exécuter exécute les instructions saisies dans le volet d'édition, produisant ainsi des résultats de requête dans l'onglet Résultats et des plans d'exécution de requêtes dans l'ongletExplication. Modifiez le comportement par défaut à l'aide de la liste déroulante pour produire des résultats uniquement ou des explications uniquement.

      La mise en surbrillance d'un élément dans l'éditeur change la commande Exécuter en Exécuter la sélection, ce qui vous permet d'exécuter uniquement ce que vous avez sélectionné.

    • La commande Effacer la requête supprime tout le texte de l'éditeur et efface les sous-onglets Résultats et Explication.
    • La commande Mettre en forme la requête met en forme les instructions dans l'éditeur pour faciliter leur lecture.
    • La commande Raccourcis affiche l'ensemble des raccourcis clavier que vous pouvez utiliser dans l'éditeur.
    • Le lien Aide sur les requêtes SQL ouvre un onglet de navigateur vers la documentation consacrée à la syntaxe des requêtes SQL.

    Les requêtes sont validées automatiquement chaque fois qu'elles sont mises à jour dans l'éditeur. Si les instructions sont valides, la barre de commandes de l'éditeur affiche une coche de confirmation et le message Valide. En cas de problème, elle affiche un message d'erreur avec des détails.

  3. L'éditeur vous permet de saisir une requête SQL et des instructions LMD. Elles sont codées par couleur et des numéros de ligne sont automatiquement ajoutés pour les instructions multilignes.

    Si vous saisissez plusieurs instructions dans l'éditeur, vous devez utiliser un point-virgule final après chaque instruction, à l'exception de la dernière.

  4. Le volet inférieur d'un onglet de requête fournit trois sous-onglets :
    • Le sous-onglet Schéma affiche les tables de la base de données et leurs schémas. Utilisez-la comme référence rapide pour rédiger des instructions dans l'éditeur.
    • Le sous-onglet Résultats affiche les résultats lorsque vous exécutez les instructions saisies dans l'éditeur. Pour les requêtes, il affiche une table de résultats, et pour les instructions LMD telles que INSERT et >UPDATE, il affiche un message indiquant le nombre de lignes concernées.
    • Le sous-onglet Explication affiche des représentations graphiques des plans de requête créés lorsque vous exécutez les instructions dans l'éditeur.
  5. Les sous-onglets Résultats et Explication fournissent tous deux un sélecteur d'instructions qui vous permet de choisir pour quelle instruction afficher les résultats ou le plan de requête de l'instruction.

Afficher des exemples de plans de requêtes

    Dans certains cas, vous pouvez afficher des échantillons de plans de requête et comparer les performances d'une requête au fil du temps. Pour les requêtes qui consomment plus de CPU, Spanner conserve les plans de requête échantillonnés pendant 30 jours sur la page Insights sur les requêtes de la console Google Cloud. Pour afficher des exemples de plans de requêtes :

  1. Accédez à la page Instances de Spanner dans la console Google Cloud.

    Accéder à la page Instances

  2. Cliquez sur le nom de l'instance associée aux requêtes que vous souhaitez examiner.

    La console Google Cloud affiche la page Présentation de l'instance.

  3. Dans le menu Navigation, sous l'en-tête "Observabilité", cliquez sur Insights sur les requêtes.

    La console Google Cloud affiche la page Insights sur les requêtes de l'instance.

  4. Dans le menu déroulant Base de données, sélectionnez la base de données contenant les requêtes. que vous souhaitez étudier.

    La console Google Cloud affiche les informations sur la charge de requêtes pour la base de données. Le tableau "Requêtes et tags TopN" affiche la liste des requêtes et des tags de requête les plus fréquents, triés en fonction de l'utilisation du processeur.

  5. Recherchez la requête présentant une utilisation élevée du processeur, que vous souhaitez afficher. des exemples de plans de requêtes. Cliquez sur la valeur FPRINT de cette requête.

    La page Détails de la requête affiche un graphique Exemples de plans de requête pour votre requête au fil du temps. Vous pouvez faire un zoom arrière jusqu'à sept jours avant l'heure actuelle. Remarque : Les plans de requêtes ne sont pas acceptés pour les requêtes avec des partitionTokens obtenus à partir de l'API PartitionQuery et des requêtes LMD partitionné.

  6. Cliquez sur l'un des points du graphique pour afficher un ancien plan de requête et pour visualiser les étapes effectuées lors de l'exécution de la requête. Vous pouvez également cliquer sur un opérateur pour afficher des informations détaillées à son sujet.

    Graphique des exemples de plans de requêtes.
    Figure 8. Graphique des exemples de plans de requêtes.

Visite guidée de l'outil de visualisation de plans de requête

Les composants clés de l'outil de visualisation sont annotés dans la capture d'écran suivante et décrits plus en détail. Après avoir exécuté une requête dans un onglet de requête, sélectionnez l'onglet Explication sous l'éditeur de requête pour ouvrir l'outil de visualisation des plans d'exécution de requêtes.

Dans le schéma suivant, le flux de données s'effectue de bas en haut, c'est-à-dire les tables et les index se trouvent au bas du schéma et dans le résultat final se trouve en haut.

<ph type="x-smartling-placeholder">
</ph> Outil de visualisation de plans de requête annoté
Figure 9 : Outil de visualisation de plans de requête annoté.
  • La visualisation de votre plan peut être grande, suivant la requête que vous avez exécutée. Pour masquer ou afficher les détails, activez le sélecteur de vue Développée/Compacte. Vous pouvez personnaliser à tout moment la partie visible du plan à l'aide de la commande de zoom.
  • L'algèbre qui explique comment Spanner exécute la requête est représentée par un graphe acyclique, où chaque nœud correspond à un itérateur qui consomme les lignes de ses entrées et produit des lignes vers son parent. La Figure 9 présente un exemple de plan. Cliquez sur le diagramme pour voir une une vue étendue de certains des détails du plan.

    Miniature de la capture d&#39;écran du plan visuel
    Figure 9 : Exemple de plan visuel (cliquez pour zoomer).
    Capture d&#39;écran agrandie du plan visuel

    Chaque nœud, ou fiche, du graphique représente un itérateur et contient les informations suivantes :

    • Le nom de l'itérateur. Un itérateur consomme les lignes de son entrée et produit des lignes.
    • Des statistiques d'exécution qui vous indiquent le nombre de lignes renvoyées, la latence et la quantité de processeur consommée.
    • Nous fournissons les indicateurs visuels suivants pour vous aider à identifier les problèmes potentiels dans le plan d'exécution de la requête.
    • Les barres rouges dans un nœud sont des indicateurs visuels du pourcentage de latence ou de temps CPU pour cet itérateur par rapport au total de la requête.
    • L'épaisseur des traits qui connectent chaque nœud représente le nombre de lignes. Plus le trait est épais, plus le nombre de lignes transmises au nœud suivant est élevé. Le nombre réel de lignes est affiché de chaque fiche et lorsque vous maintenez le pointeur sur un connecteur.
    • Un triangle d'avertissement s'affiche sur un nœud au niveau duquel une analyse complète de la table a été effectuée. Le panneau d'informations fournit des détails supplémentaires, par exemple des recommandations telles que l'ajout d'un index, ou la révision de la requête ou du schéma par d'autres biais si possible afin d'éviter une analyse complète.
    • Sélectionnez une fiche dans le plan pour afficher les détails dans le panneau d'informations à droite (5).

  • La mini-carte du plan d'exécution montre une vue en zoom arrière du plan complet. Elle est utile pour déterminer la forme globale du plan d'exécution et pour accéder rapidement aux différentes parties du plan. Faire glisser directement sur la mini-carte ou cliquez à l'endroit où vous souhaitez placer le curseur afin d'accéder une autre partie du plan visuel.
  • Sélectionnez TÉLÉCHARGER JSON pour télécharger une version JSON de qui s'avère utile lorsque vous contactez le service pour obtenir de l'assistance.
  • Le panneau d'informations affiche des informations contextuelles détaillées sur le nœud sélectionné dans le schéma du plan de requête. Les informations sont organisées suivant les catégories ci-dessous.
    • Les informations sur l'itérateur fournissent des détails et des statistiques d'exécution sur la fiche d'itérateur que vous avez sélectionnée dans le graphique.
    • Le récapitulatif de la requête fournit des détails sur le nombre de lignes renvoyées et le temps nécessaire à l'exécution de la requête. Les opérateurs principaux sont ceux qui présentent une latence significative, consomment une quantité de processeur importante par rapport aux autres opérateurs et renvoient un nombre élevé de lignes de données.
    • La chronologie d'exécution de la requête est un graphique basé sur le temps qui indique la durée pendant laquelle chaque groupe de machines exécute sa portion de la requête. Un groupe de machines ne s'exécute pas nécessairement pour l'intégralité de la durée d'exécution de la requête. Il est également possible qu'un groupe de machines s'exécute plusieurs fois lors de l'exécution de la requête, mais la chronologie ne représente alors que le début de la première exécution et la fin de la dernière exécution.
  • Régler une requête qui présente de mauvaises performances

    Imaginons que votre entreprise gère une base de données de films en ligne contenant des informations sur des films telles que le casting, les sociétés de production, les détails des films, etc. Le service s'exécute sur Spanner, mais depuis peu vous rencontrez certains problèmes de performances.

    En tant que développeur principal de ce service, il vous est demandé d'enquêter sur ces problèmes de performances, car ils génèrent des notes médiocres pour le service. Ouvrez la console Google Cloud, accédez à votre instance de base de données, puis ouvrez l'éditeur de requête. Vous saisissez la requête suivante dans l'éditeur et vous l'exécutez.

    SELECT
      t.title,
      MIN(t.production_year) AS year,
      ANY_VALUE(mc.note HAVING MIN t.production_year) AS note
    FROM
      title AS t
    JOIN
      movie_companies AS mc
    ON
      t.id = mc.movie_id
    WHERE
      t.title LIKE '% the %'
    GROUP BY
      title;
    

    Le résultat de l'exécution de cette requête est illustré dans la capture d'écran suivante. Nous avons mis en forme la requête dans l'éditeur en sélectionnant Mettre en forme la requête. Une note en haut à droite de l'écran nous indique également que la requête est valide.

    Éditeur de requête affichant la requête d&#39;origine
    Figure 1. Éditeur de requête affichant la requête d'origine.

    L'onglet Résultats sous l'éditeur de requête indique que la requête s'est terminée en un peu plus de deux minutes. Vous décidez d'examiner de plus près la requête pour voir si elle est efficace.

    Analyser les requêtes lentes avec le visualiseur du plan de requête

    À ce stade, nous savons que la requête de l'étape précédente prend plus de deux minutes, mais nous ne savons pas si elle est aussi efficace que possible et, par conséquent, si cette durée est attendue.

    Sélectionnez l'onglet EXPLANATION juste en dessous de l'éditeur de requête pour afficher un visuel du plan d'exécution créé par Spanner pour exécuter une requête et renvoyer les résultats.

    Le plan présenté dans la capture d'écran suivante est relativement volumineux mais, même à ce niveau d'agrandissement, vous pouvez effectuer les observations suivantes.

    • Le résumé de la requête dans le panneau d'information de droite indique que près de trois millions de lignes ont été analysées et que moins de 64 000 ont finalement été renvoyées.

    • Nous pouvons également voir dans le panneau Chronologie d'exécution de la requête que quatre groupes de machines ont été impliqués dans la requête. Un groupe de machines est responsable de l'exécution d'une partie de la requête. Les opérateurs peuvent s'exécuter sur une ou plusieurs machines. La sélection d'un groupe de machines dans la chronologie met en évidence dans le plan visuel quelle partie de la requête a été exécutée sur ce groupe.

    Outil de visualisation de plans de requête affichant une explication visuelle de la requête d&#39;origine
    Figure 2 : Outil de visualisation de plans de requête affichant une explication visuelle de la requête d'origine.

    Compte tenu de ces facteurs, vous décidez qu'une amélioration des performances en modifiant la jointure "apply", que Spanner a choisi en une jointure de hachage.

    Améliorer la requête

    Pour améliorer les performances de la requête, vous utilisez une optimisation de jointure afin de remplacer la méthode de jointure par une jointure de hachage. Cette mise en œuvre de jointure exécute un traitement basé sur des ensembles.

    Voici la requête mise à jour :

    SELECT
      t.title,
      MIN(t.production_year) AS year,
      ANY_VALUE(mc.note HAVING MIN t.production_year) AS note
    FROM
      title AS t
    JOIN
      @{join_method=hash_join} movie_companies AS mc
    ON
      t.id = mc.movie_id
    WHERE
      t.title LIKE '% the %'
    GROUP BY
      title;
    

    La capture d'écran suivante illustre la requête mise à jour. Comme le montre la capture d'écran, la requête s'est terminée en moins de 5 secondes, soit une amélioration significative par rapport à la durée d'exécution de plus de 120 secondes avant cette modification.

    Éditeur de requêtes affichant la requête améliorée
    Figure 3 : Éditeur de requêtes affichant la requête améliorée.

    Examinez le nouveau plan visuel, illustré dans le schéma suivant, pour voir ce que il nous renseigne sur cette amélioration.

    Visualisation d&#39;une requête dans l&#39;interface utilisateur de Cloud Console
    Figure 4 : Visualisation du plan de requête après l'amélioration de la requête (cliquez pour agrandir).

    Capture d&#39;écran agrandie du plan visuel

    Vous remarquez immédiatement certaines différences :

    • Un seul groupe de machines a été impliqué dans l'exécution de cette requête.

    • Le nombre d'agrégations a été considérablement réduit.

    Conclusion

    Dans ce scénario, nous avons exécuté une requête lente et examiné son plan visuel pour rechercher des éléments inefficaces. Vous trouverez ci-dessous un récapitulatif des requêtes et des plans avant et après toute modification. Chaque onglet affiche la requête exécutée et une vue compacte de la visualisation complète du plan d'exécution de requête.

    Avant

    SELECT
      t.title,
      MIN(t.production_year) AS year,
      ANY_VALUE(mc.note
      HAVING
        MIN t.production_year) AS note
    FROM
      title AS t
    JOIN
      movie_companies AS mc
    ON
      t.id = mc.movie_id
    WHERE
      t.title LIKE '% the %'
    GROUP BY
      title;
    
    Vue compacte du plan visuel avant toute amélioration.
    Figure 5 Vue compacte du plan visuel avant toute amélioration.

    Après

    SELECT
      t.title,
      MIN(t.production_year) AS year,
      ANY_VALUE(mc.note
      HAVING
        MIN t.production_year) AS note
    FROM
      title AS t
    JOIN
      @{join_method=hash_join} movie_companies AS mc
    ON
      t.id = mc.movie_id
    WHERE
      t.title LIKE '% the %'
    GROUP BY
      title;
    
    Vue compacte du plan visuel après amélioration.
    Figure 6. Vue compacte du plan visuel après amélioration.

    Un indicateur que quelque chose pourrait être amélioré dans ce scénario était qu'un grand proportion des lignes de la table title ont qualifié le filtre LIKE '% the %'. Effectuer une recherche dans une autre table avec autant de lignes risque d'être coûteux. Le remplacement de notre mise en œuvre de jointure par une jointure de hachage a permis d'améliorer considérablement les performances.

    Étape suivante