Table des matières
- Qu'est-ce que Nested Loop Join dans Oracle
- Comment fonctionne la jointure de boucle imbriquée dans Oracle
- Nouvelle méthode pour la jointure de boucle imbriquée dans Oracle 11g
- Jointure externe de boucles imbriquées dans Oracle
Qu'est-ce que la jointure de boucle imbriquée dans Oracle
-Pour chaque ligne de la première source de ligne, accédez à toutes les lignes de la deuxième source de ligne.
-La jointure NESTED LOOPS est une opération de jointure qui sélectionne une ligne à partir de la source de ligne de début sélectionnée et utilise les valeurs de cette source de ligne pour conduire ou sélectionner dans la source de ligne jointe en recherchant la ligne correspondante.
-Meilleur pour les transactions de type OLTP
-ce sera plus rapide si les lignes renvoyées à partir de la première table sont petites
-Nested Loop Join dans Oracle 11g fonctionne différemment. Des détails à ce sujet sont donnés dans cet article
Comment fonctionne la jointure de boucles imbriquées dans Oracle
-L'optimiseur oracle détermine d'abord la table de pilotage et la désigne comme boucle externe. Il s'agit de la source de la ligne de pilotage. Il produit un ensemble de lignes pour piloter la condition de jointure. La source de la ligne peut être une table accessible à l'aide d'un balayage d'index ou d'un balayage complet de la table. Les rangées peuvent également être produites à partir de n'importe quelle autre opération. Par exemple, la sortie d'une jointure de boucle imbriquée peut être utilisée comme source de ligne.
- L'optimiseur désigne une autre table comme boucle interne. Ceci est itéré pour chaque ligne renvoyée par la boucle externe. Il s'agit d'une opération d'accès sur une table et devrait idéalement être un parcours d'index.
-L'opération effectuée par la table INNER est répétée pour chaque ligne renvoyée dans la table OUTER
for x in (select from outer table) loop for row in (select from inner table ) loop joined output rows is returned where condition is matched end loop end loop
Exemple de jointure de boucle imbriquée
select /* +use_nl( a b) */ a.emp_no,b.dept_no,b.dept_name from emp a,dept b where a.dept_no=b.dept_no; SELECT STATEMENT NESTED LOOP TABLE ACCESS FULL DEPT TABLE ACCESS BY INDEX ROWID EMP INDEX RANGE SCAN EMP_N1
Comment est-il traité
(1) Lisez la première ligne dans DEPT
(2) Effectuez l'analyse de l'index sur EMP_N1 pour trouver dept_no correspondant et obtenez le premier rowid
(3) Recherchez la ligne référencée dans EMP, joignez les informations et fournissez output
(4) Répétez l'opération 2,3 pour chaque rowid renvoyé
(5) Répétez l'opération 1,2,3,4 pour toutes les lignes de DEPT
for x in (select from table dept)
boucle
for row in (select from table emp )
boucle
les lignes de sortie jointes sont renvoyées lorsque la condition est satisfaite
end boucle
fin de boucle
Ici, la méthode d'accès pour sélectionner à partir de la table emp serait par balayage d'index
Si l'optimiseur choisit d'utiliser une autre méthode de jointure, vous pouvez utiliser l'indicateur USE_NL(A B), où A et B sont les alias des tables être rejoint.
Calculs des coûts
Dans une jointure NESTED LOOPS, pour chaque ligne de l'ensemble de lignes externe, l'ensemble de lignes interne est accessible pour rechercher toutes les lignes correspondantes à joindre. Par conséquent, dans ce type de jointure, l'ensemble de lignes interne est consulté autant de fois que le nombre de lignes de l'ensemble de lignes externe.
Coût :coût d'accès à la table A + nombre de lignes renvoyées par la table A X coût d'accès à la table B
Ainsi, cela sera rentable si de petites lignes sont renvoyées à partir de la table externe et que l'opération d'accès à la table interne se fait via une analyse unique ou une analyse de petite plage d'index
Nouvelle méthode de jointure de boucle imbriquée dans Oracle 11g
SELECT STATEMENT NESTED LOOPS NESTED LOOPS TABLE ACCESS FULL DEPT INDEX UNIQUE SCAN EMP_IDX TABLE ACCESS BY INDEX ROWID EMP
La documentation d'Oracle en parle
Lorsqu'un index ou un bloc de table ne se trouve pas dans le cache tampon et est nécessaire pour traiter la jointure, une E/S physique est requise. Dans Oracle Database 11g Release 1 (11.1), Oracle Database peut regrouper plusieurs requêtes d'E/S physiques et les traiter à l'aide d'une E/S vectorielle au lieu de les traiter une par une. Dans le cadre de la nouvelle implémentation des jointures de boucles imbriquées, deux sources de ligne de jointure NESTED LOOPS peuvent apparaître dans le plan d'exécution alors qu'une seule était apparue dans les versions précédentes. Dans de tels cas, Oracle Database alloue une source de ligne de jointure NESTED LOOPS pour joindre les valeurs de la table du côté extérieur de la jointure avec l'index du côté intérieur. Une deuxième source de ligne est allouée pour joindre le résultat de la première jointure, qui inclut les rowids stockés dans l'index oracle, avec la table à l'intérieur de la jointure"
Jointure externe Nested Loops dans Oracle
-Similaire à la boucle imbriquée
-Les lignes sont renvoyées même si la boucle interne ne contient aucune ligne répondant aux critères
-Contrairement à la boucle imbriquée qui peut être pilotée à partir de l'une ou l'autre des tables, il s'agit d'une jointure unidirectionnelle
a =b(+) ira toujours vers a avant b, cela peut entraîner un plan plus cher (éventuellement non-NL)
(+) va toujours du côté déficient
Lit également
Hash Join
Méthode Join dans Oracle
https://en.wikipedia.org/wiki/Nested_loop_join