Oracle
 sql >> Base de données >  >> RDS >> Oracle

Jointure de boucle imbriquée dans Oracle 11g

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