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

Jointure de hachage dans Oracle avec exemple

Table des matières

  • Qu'est-ce que la jointure par hachage dans Oracle ?
  • Algorithme pour Oracle Hash Join
  • Hash join Oracle Example :
  • indice de jointure de hachage Oracle 
  • Quelques points importants concernant la jointure par hachage dans Oracle
  • Différence entre la boucle imbriquée et la jointure par hachage

Qu'est-ce que la jointure par hachage dans Oracle ?

Les jointures par hachage sont utilisées lors de la jointure de grandes tables ou lorsque les jointures nécessitent la plupart des lignes des tables jointes. Ceci est utilisé uniquement pour les jointures d'égalité

Algorithme pour Oracle Hash Join

1) L'optimiseur utilise la plus petite des 2 tables pour créer une table de hachage en mémoire. La petite table est appelée table de construction

Phase de construction

Pour chaque ligne dans une petite boucle de table
Calculer la valeur de hachage sur la clé de jointure
Insérer une ligne dans le compartiment de hachage approprié.
Fin de la boucle ;

2) analyse ensuite les grandes tables et compare la valeur de hachage (des lignes de la grande table) avec cette table de hachage pour trouver les lignes jointes. La grande table est appelée table de sonde

Phase de sonde

Pour chaque ligne dans une grande boucle de table
Calculez la valeur de hachage sur la clé de jointure
Sondez la table de hachage pour la valeur de hachage
Si correspondance trouvée
Renvoyez les lignes
Fin de la boucle ;

L'explication ci-dessus est vraie lorsque la table de hachage en cours de développement tient entièrement dans la mémoire. Si la table de hachage est trop grande pour tenir dans la mémoire disponible, alors Oracle effectue le traitement d'une manière légèrement différente.
Fondamentalement, si la table de hachage est trop volumineux pour tenir dans la mémoire disponible Oracle dispose d'un mécanisme pour l'enregistrer sur disque par lots (appelés partitions) et enregistrer la table de sonde sur disque par lots correspondants, puis effectuer la jointure par morceaux entre les lots correspondants

Fondamentalement, lorsque la zone de hachage se remplit, Oracle devra utiliser l'espace de table TEMP. Oracle choisira la plus grande partition dans le hachage et l'écrira dans TEMP. Oracle conserve en mémoire un index de type bitmap de la table de hachage entière. Cet index sait seulement que pour un compartiment de hachage donné (emplacement dans la table de hachage), il existe ou non une valeur. Mais l'index n'a pas la valeur réelle.

Par conséquent, si une ligne de la deuxième table ou de la table de sondage est hachée vers l'un de ces emplacements, la seule chose connue est qu'il existe une correspondance potentielle. Le processus de création de la table de hachage se poursuit jusqu'à ce que la table de hachage entière soit terminée. Une partie de la table de hachage est en mémoire et une partie est sur le disque

Maintenant, Oracle commence à lire la sonde ou une autre table et commence à créer le hachage de la clé de jointure. Si la clé de hachage correspond au hachage en mémoire, la jointure est terminée et la ligne est renvoyée. Si la ligne est la correspondance potentielle, alors oracle stockera cette ligne sur le tablespace TEMP dans le même schéma de partitionnement que celui où les données de la première ligne ont été conservées.

Une fois que la première passe de l'ensemble de la table secondaire est terminée et que toutes les lignes de la table de hachage en mémoire sont données, Oracle commencera à regarder la partition correspondante sur le disque et il traitera chaque partition une par une et lira les lignes dans la mémoire et traiter la sortie

Hash join Oracle Exemple :

select /* +use_hash( a b) */ a.emp_no,b.dept_no,b.dept_name from emp a,dept b where a.dept_no=b.dept_no;Plan---------- --------------------------------------------SÉLECTIONNER STATEMENTHASH JOINTABLE ACCESS FULL EMPTABLE ACCESS FULL DEPT 

Comment la jointure de hachage dans Oracle est traitée
1) La première table EMP est analysée et hachée
2) la table dept est analysée pour chaque ligne et un hachage est créé pour la jointure en conservant dept_no
3) le hachage dept_no est mis en correspondance dans la table de hachage , si une correspondance est trouvée, les lignes jointes sont renvoyées

indice de jointure de hachage Oracle 

Oracle a fourni l'indice use_hash pour forcer l'utilisation de la jointure par hachage.

Usageselect /* +use_hash(table alias) */ ......

Cela indique à l'optimiseur que la méthode de jointure à utiliser lorsque "table_alias" est la prochaine source de ligne dans l'ordre de jointure doit être une jointure par hachage ; cependant, il n'indique pas à l'optimiseur si cette source de ligne doit être utilisée comme table de construction ou comme table de sonde.

Pour spécifier comment la source de ligne est utilisée, vous avez besoin d'un deuxième indice :no_swap_join_inputs("table_alias") si vous voulez qu'Oracle utilise la source de ligne comme table de sonde, ou swap_join_inputs("table_alias") si vous voulez qu'Oracle l'utilise comme build tableau

Quelques points importants sur la jointure par hachage dans Oracle

1) La sortie du résultat de la jointure par hachage n'est pas instantanée car la jointure par hachage est bloquée lors de la création de la table de hachage. Une fois la construction de la table de hachage terminée, les lignes sont renvoyées plus rapidement
2) Les jointures par hachage sont couramment observées avec l'optimiseur ALL_ROWS mode, car il fonctionne sur un modèle d'affichage des résultats après que toutes les lignes d'au moins une des tables sont hachées dans la table de hachage.
3) La table de hachage est la mémoire privée, de sorte que l'accès aux données n'entraîne pas beaucoup d'activité de verrouillage

Coût de la jointure de hachage =Coût de la lecture de la table A + coût de la lecture de la table B + un peu de traitement en mémoire

Différence entre la boucle imbriquée et la jointure par hachage

Jointure par hachage Joindre imbriquée
Les jointures par hachage sont utilisées lors de la jointure de grandes tables ou lorsque les jointures nécessitent la plupart des lignes des tables jointes. Ceci est utilisé uniquement pour les jointures d'égalité 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 accéder ou sélectionner à partir de la source de ligne jointe à la recherche de la ligne correspondante.
-Idéal pour les transactions de type OLTP
L'opération de hachage est normalement efficace pour les deux ensembles de données lorsqu'un grand nombre d'enregistrements sont renvoyés. Lorsqu'un ensemble de données n'a pas ou un petit nombre d'enregistrements renvoyés et qu'un autre ensemble de données peut être mis en correspondance à l'aide d'une opération d'index, la jointure de boucle imbriquée est plus efficace
Vous pouvez voir plus de jointures de hachage utilisées avec le mode d'optimisation ALL_ROWS, car il fonctionne sur le modèle d'affichage des résultats après que toutes les lignes d'au moins une des tables sont hachées dans la table de hachage. Vous constaterez une plus grande utilisation de la boucle imbriquée lors de l'utilisation du mode d'optimisation FIRST_ROWS, car il fonctionne sur le modèle d'affichage des résultats instantanés à l'utilisateur au fur et à mesure qu'ils sont récupérés. Il n'est pas nécessaire de sélectionner la mise en cache des données avant qu'elles ne soient renvoyées à l'utilisateur. En cas de jointure par hachage, elle est nécessaire et est expliquée ci-dessous.