Glossaire des plans d'exécution PostgreSQL
En règle générale:
- Sélectivité : Une requête est très sélective si elle renvoie un petit nombre de tuples par rapport à la taille totale de la table. Si l’index permet de rapidement identifier ces tuples (par exemple en scannant un petit nombre de feuilles dans un arbre B+), il sera effectivement très utile.
- Index couvrant : Un index est dit couvrant s’il contient toutes les colonnes nécessaires à la requête. Ainsi, la requête peut être résolue en ne consultant que l’index sans devoir accéder à la table.
- Index groupant : Un index est dit groupant lorsqu’il trie les données d’une manière pertinente pour la requête, permettant ainsi de réduire ou d’optimiser les opérations de tri ou de regroupement.
- Peu d’utilité : Si l’index ne remplit aucun des rôles ci-dessus (ni sélectif, ni couvrant, ni groupant), il est en effet probable qu’il n’apportera aucun bénéfice.
Exercice 1
Dans chaque cas ci-dessous, indiquer si l’index create index t_idx on t(a,b)
a des chances d’être utile à la requête et le cas échéant pourquoi (lister toutes les raisons).
Q1:
SELECT first_value(c) OVER (ORDER BY b)
FROM t
WHERE a = 12;
Q2:
SELECT * FROM t
WHERE b = 1;
Q3:
SELECT * FROM t
WHERE a = 2 AND b = 3;
Q4:
SELECT * FROM t
WHERE a LIKE 'Par%';
Q5:
SELECT a, b FROM t
ORDER BY a;
Q6:
SELECT * FROM t
ORDER BY a;
Q7:
SELECT a, SUM(c) FROM t
GROUP BY a;
Exercice 2
En l’absence d’index sur la table, comparez les performances des deux requêtes suivantes :
- Requête 1 :
SELECT * FROM t
WHERE a = 38;
- Requête 2 :
SELECT * FROM t
WHERE a = 38 AND c = 3;
Le fait d’ajouter une condition supplémentaire dans la seconde requête (c = 3
) peut-il accélérer, ralentir, ou n’avoir aucun effet significatif sur le temps d’exécution de la requête, sachant qu’il n’y a pas d’index sur la table ? Justifiez votre réponse en termes de scan de table et de filtrage des résultats.
Exercice 3
Contexte :
On vous demande de construire un B-tree d’ordre 3 (chaque noeud peut contenir entre 2 et 5 clés) à partir des clés suivantes, insérées dans cet ordre :
25, 16, 20, 4, 9, 30, 18, 10, 12, 28
À chaque étape, dessinez l’arbre après l’insertion d’une nouvelle clé et expliquez le processus d’insertion (comment sont redistribuées les clés et quand les noeuds sont éclatés).
Étapes de l’exercice :
- Insertion de 25 : Commencez par insérer la première clé.
- Insertion de 16 et 20 : Insérez les deux clés suivantes dans le même noeud, car il peut contenir jusqu’à 4 clés.
- Insertion de 4 : Continuez en insérant la clé 4. Le noeud n’est pas encore plein.
- Insertion de 9 : Après avoir inséré la clé 9, le noeud devient plein. Expliquez comment il est éclaté (split) et redistribué.
- Insertion de 30, 18, 10, 12, 28 : Continuez le processus d’insertion pour chaque clé, en éclatant les noeuds si nécessaire.
Consignes :
- Dessinez l’arbre à chaque étape d’insertion.
- Identifiez quand un éclatement de noeud est nécessaire.
- Après chaque éclatement, expliquez comment les clés sont redistribuées entre les noeuds.
Question :
Quelle est la hauteur de l’arbre final et pourquoi est-ce important dans le contexte de la recherche de données dans un B-tree ?