Documentation PostgreSQL 7.4.29 | ||||
---|---|---|---|---|
Précédent | Arrière rapide | Chapitre 42. Présentation des mécanismes internes de PostgreSQL | Avance rapide | Suivant |
L'exécuteur prend le plan envoyé par le planificateur/optimiseur et l'exécute récursivement pour extraire l'ensemble requis de lignes. Ceci est essentiellement un mécanisme de pipeline en demande-envoi. Chaque fois qu'un nœud du plan est appelé, il doit apporter une ligne supplémentaire ou indiquer qu'il a fini d'envoyer des lignes.
Pour donner un exemple concret, supposez que le nœud supérieur soit un nœud MergeJoin. Avant qu'une fusion puisse être faite, deux lignes doivent être récupérées (une pour chaque sous-plan). Donc, l'exécuteur s'appelle récursivement pour exécuter les sous-plans (il commence avec le sous-plan attaché à l'arbre gauche). Le nouveau nœud supérieur (le nœud supérieur du sous-plan gauche) est, disons, un nœud Sort (NdT : Tri) et une récursion est une nouvelle fois nécessaire pour obtenir une ligne en entrée. Le nœud fils de Sort pourrait être un nœud SeqScan, représentant la lecture réelle d'une table. L'exécution de ce nœud fait que l'exécuteur récupère une ligne à partir de la table et la renvoie au nœud appelant. Le nœud Sort appellera de façon répétée son fils pour obtenir toutes les lignes à trier. Quand l'entrée est terminée (indiqué par le nœud fils renvoyant un NULL au lieu d'une ligne), le code de Sort est enfin capable de renvoyer sa première ligne en sortie, c'est-à-dire le premier suivant l'ordre de tri. Il conserve les lignes restantes de façon à les renvoyer dans le bon ordre en réponse à des demandes ultérieures.
Le nœud MergeJoin demande de la même façon la première ligne à partir du sous-plan droit. Ensuite, il compare les deux lignes pour savoir si elles peuvent être jointes ; si c'est le cas, il renvoie la ligne de jointure à son appelant. Au prochain appel, ou immédiatement s'il ne peut pas joindre la paire actuelle d'entrées, il avance sur la prochaine ligne d'une des deux tables (suivant le résultat de la comparaison), et vérifie de nouveau la correspondance. Éventuellement, un sous-plan est terminé et le nœud MergeJoin renvoie NULL pour indiquer qu'il n'y a plus de lignes jointes à former.
Les requêtes complexes peuvent nécessiter un grand nombre de niveaux de nœuds pour les plans, mais l'approche générale est la même : chaque nœud est exécuté et renvoie sa prochaine ligne en sortie à chaque fois qu'il est appelé. Chaque nœud est responsable aussi de l'application de toute expression de sélection ou projection qui lui ont été confiées par le planificateur.
Le mécanisme de l'exécuteur est utilisé pour évaluer les quatre types de requêtes de base en SQL : SELECT, INSERT, UPDATE et DELETE. Pour SELECT, le code de l'exécuteur au niveau supérieur a seulement besoin d'envoyer chaque ligne retournée par l'arbre plan de la requête vers le client. Pour INSERT, chaque ligne renvoyée est insérée dans la table cible spécifiée par le INSERT. (Une simple commande INSERT ... VALUES crée un arbre plan trivial consistant en un seul nœud, Result, calculant une seule ligne de résultat. Mais INSERT ... SELECT pourrait demander la pleine puissance du mécanisme de l'exécuteur.) Pour UPDATE, le planificateur s'arrange pour que chaque ligne calculée inclue toutes les valeurs mises à jour des colonnes, plus le TID (tuple ID ou l'identifiant de la ligne) de la ligne de la cible originale ; l'exécuteur de haut niveau utilise cette information pour créer une nouvelle ligne mise à jour et pour marquer la suppression de l'ancienne ligne. Pour DELETE, la seule colonne renvoyée par le plan est le TID, et l'exécuteur de haut niveau utilise simplement le TID pour visiter les lignes cible et les marquer comme supprimées.
Précédent | Sommaire | Suivant |
Planificateur/Optimiseur | Niveau supérieur | Catalogues système |