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

Quelle est la différence entre une jointure par hachage et une jointure par fusion (Oracle RDBMS) ?

Une jointure "fusion de tri" est effectuée en triant les deux ensembles de données à joindre en fonction des clés de jointure, puis en les fusionnant. La fusion est très bon marché, mais le tri peut être d'un coût prohibitif, surtout si le tri se répand sur le disque. Le coût du tri peut être réduit si l'un des ensembles de données est accessible dans un ordre trié via un index, bien que l'accès à une forte proportion de blocs d'une table via un parcours d'index puisse également être très coûteux par rapport à un parcours de table complet .

Une jointure de hachage est effectuée en hachant un ensemble de données dans la mémoire en fonction des colonnes de jointure et en lisant l'autre et en sondant la table de hachage pour les correspondances. La jointure par hachage est très peu coûteuse lorsque la table de hachage peut être entièrement conservée en mémoire, le coût total s'élevant à un peu plus que le coût de lecture des ensembles de données. Le coût augmente si la table de hachage doit être déversée sur le disque lors d'un tri en une seule passe, et augmente considérablement pour un tri en plusieurs passes.

(Dans la version antérieure à 10g, les jointures externes d'une grande à une petite table étaient problématiques en termes de performances, car l'optimiseur ne pouvait pas résoudre le besoin d'accéder d'abord à la plus petite table pour une jointure par hachage, mais à la plus grande table en premier pour une jointure externe. Par conséquent, les jointures par hachage n'étaient pas disponibles dans cette situation).

Le coût d'une jointure par hachage peut être réduit en partitionnant les deux tables sur la ou les clés de jointure. Cela permet à l'optimiseur de déduire que les lignes d'une partition d'une table ne trouveront une correspondance que dans une partition particulière de l'autre table, et pour les tables ayant n partitions, la jointure par hachage est exécutée comme n jointures par hachage indépendantes. Cela a les effets suivants :

  1. La taille de chaque table de hachage est réduite, réduisant ainsi la quantité maximale de mémoire requise et supprimant potentiellement la nécessité pour l'opération de nécessiter un espace disque temporaire.
  2. Pour les opérations de requête parallèles, la quantité de messages inter-processus est considérablement réduite, ce qui réduit l'utilisation du processeur et améliore les performances, car chaque jointure par hachage peut être effectuée par une paire de processus PQ.
  3. Pour les opérations de requête non parallèles, les besoins en mémoire sont réduits d'un facteur n, et les premières lignes sont projetées plus tôt à partir de la requête.

Vous devez noter que les jointures par hachage ne peuvent être utilisées que pour les équi-jointures, mais les jointures par fusion sont plus flexibles.

En général, si vous joignez de grandes quantités de données dans une équi-jointure, une jointure par hachage sera un meilleur pari.

Ce sujet est très bien traité dans la documentation.

http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523

Documentation 12.1 :https://docs.oracle.com/database/121/TGSQL/tgsql_join.htm