Bonjour,
Je suis en train de lire la doc Oracle sur les jointures et je lis que durant un Nested Loops Join, Oracle peut utiliser un index pour accéder aux données de la inner table pour chaque ligne de la outer table.
La question que je me pose est : est-ce que Oracle peut utiliser un index à la fois lors de la sélection des données dans la phase d'accès aux tables et aussi lors de la jointure? J'ai l'impression de mélanger les deux.
https://docs.oracle.com/database/121...n.htm#TGSQL244
"Nested Loops Joins
Nested loops join an outer data set to an inner data set. For each row in the outer data set that matches the single-table predicates, the database retrieves all rows in the inner data set that satisfy the join predicate. If an index is available, then the database can use it to access the inner data set by rowid."
Exemple :
Select E.name, S.sector_id
from EMP E, SECTOR S
where E.sector_id = S.sector_id
and E.city>'D' and E.city <'G';
Imaginons que Oracle accède à la table EMP avec un INDEX RANGE SCAN pour ramener tous les employés des villes entre D et G : on a le DATASET01. Ensuite Oracle fait un Full table scan sur la table SECTOR pour ramener tous les sector_id : on a le DATASET02.
Maintenant Oracle fait un Nested Loop Join avec le DATASET01 comme outer table --> est-ce qu'il peut utiliser un index sur la table SECTOR, colonne sector_id pour accélérer la recherche?
Cela me semble confus car si on ramène le DATASET02, l'accès à la table SECTOR a déjà eu lieu et je ne vois pas comment Oracle pourrait utiliser à nouveau un index pour accéder à des données en mémoire.
En clair je pense ne pas avoir compris comment fonctionnent les deux parties de l'optimiseur ramenant les données :
1) Optimizer Access Paths aux tables : Full table scan, index unique scan...
2) Joins : nested loops join, merge join...
Je croyais qu'on faisait l'étape 1 en premier : ramener les données des deux tables, indépendamment de leur jointure PUIS on exécutait la jointure en ne retenant de la deuxième table que celles satisfaisant la condition de jointure. Visiblement c'est : étape 1 pour accéder aux données de la table 1 PUIS jointure pour accéder aux données de la table 2 avec, éventuellement, utilisation d'un index.
Je suis un peu embarrassé de mon ignorance mais bon, ces points sont fondamentaux donc hors de question de se planter dessus.
[EDIT]
Pour ajouter un peu à ma confusion : lors de la lecture d'un plan d'exécution, on m'a dit ici que les étapes les plus indentées étaient exécutées en premier puis on remonte l'arbre pour exécuter les étapes du dessus; ça signifie que pour un Nested loop join, on sélectionne bien les données de la table 1 puis de la table 2 ET ENSUITE la jointure ex exécutée donc on a bien 3 étapes : accès table 1, accès table 2 puis jointure.
Ouf, je retombe un peu sur mes pieds.
Partager