par Guillaume Lelarge.

Opération de jointure


Une requête SQL arrive dans un bar et voit deux tables.
Elle s'approche des tables et leur demande « Puis-me joindre à vous ? »

— Source : inconnu

L'opération de jointure transforme un modèle normalisé en une forme dénormalisée qui convient à un traitement spécifique. Joindre plusieurs relations est une opération très sensible aux latences d'accès des disques car cette opération combine des fragments de données réparties sur le disque. Une bonne indexation est de nouveau la meilleure solution pour réduire les temps de réponse. Le bon index dépend principalement de l'algorithme choisi, parmi trois, pour effectuer la jointure.

Cependant, il existe un comportement commun à tous les algorithmes de jointure : ils traitent seulement deux tables à la fois. Une requête SQL comprenant plus de tables nécessite plusieurs étapes : tout d'abord construire un résultat intermédiaire provenant de la jointure de deux tables, puis joindre ce résultat avec la table suivante, et ainsi de suite.

Envoi des résultats intermédiaires par pipeline

Malgré l'existence de résultats intermédiaires, cela ne signifie pas que la base de données doit les matérialiser. Autrement dit, elle n'a pas besoin d'avoir le résultat complet de la première jointure avant de commencer la jointure suivante. Les bases de données utilisent des pipelines pour réduire l'utilisation de la mémoire. Chaque ligne provenant du résultat intermédiaire est immédiatement envoyée via le pipeline à la prochaine opération de jointure, évitant ainsi d'avoir à écrire le résultat intermédiaire.

Même si l'ordre de jointure n'a aucun impact sur le résultat final, il affecte les performances. Du coup, l'optimiseur va évaluer toutes les permutations possibles dans l'ordre de jointure et sélectionner le meilleur. L'optimisation d'une requête complexe peut de ce fait devenir un souci pour les performances. Plus il y a de tables à joindre et plus il existe de variantes de plans d'exécution. En langage mathématique : n! (croissance factorielle). Néanmoins, cela n'est pas un problème lors de l'utilisation de paramètres liés.

Important

Plus une requête est complexe, plus il est important d'utiliser les paramètres liés.

Ne pas utiliser les paramètres liés revient à recompiler un programme à chaque utilisation.

Contenu

  1. Boucles imbriquées — À propos du problème des sélections N+1 dans les ORM

  2. Jointure de hachage — Requiert une approche complètement différente de l'indexation

  3. Jointure par tri ‌— Comme une fermeture éclaire sur deux ensembles triés

Section précédenteSection suivante

À propos de l'auteur

Photo de Markus Winand

Markus Winand teaches efficient SQL—inhouse and online. He minimizes the development time using modern SQL and optimizes the runtime with smart indexing—for that he also published the book SQL Performance Explained.

Livre de Markus

Couverture du livre « SQL : Au cœur des performances »

L'essence de SQL tuning dans 200 pages.

Acheter de Markus
(Livre de poche et PDF)

Achetez chez Amazon
(Seulement en poche)

“Use The Index, Luke!” by Markus Winand and translated by Guillaume Lelarge is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Mentions légales | Contact | NO WARRANTY | Marque déposée | Privacy | CC-BY-NC-ND 3.0 license