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

Quels sont les gains / pertes de performance entre les jointures de hachage et les jointures de fusion, en particulier dans le SGBDR Oracle?

Une jointure “sortinge la fusion” est effectuée en sortingant les deux fichiers à joindre en fonction des clés de jointure, puis en les fusionnant. La fusion est très bon marché, mais le coût peut être prohibitif, surtout si le sorting est trop important. Le coût du sorting peut être réduit si l’un des ensembles de données est accessible dans un ordre sortingé via un index, bien que l’access à une forte proportion de blocs d’une table via une parsing d’index puisse être très coûteux par rapport à une parsing de table complète. .

Une jointure de hachage est effectuée en hachant un jeu de données en mémoire en fonction des colonnes de jointure et en lisant l’autre et en sondant la table de hachage pour rechercher des correspondances. La jointure de hachage est très peu coûteuse lorsque la table de hachage peut être conservée entièrement en mémoire, avec un coût total très inférieur au coût de lecture des ensembles de données. Le coût augmente si la table de hachage doit être déversée sur un disque en un seul passage et augmente considérablement pour un sorting multipasse.

(Dans les versions antérieures à 10g, les jointures externes d’une grande à une petite table étaient problématiques en termes de performances, car l’optimiseur ne pouvait pas accéder à la plus petite table pour une jointure de hachage, mais la plus grande pour une jointure externe. Par conséquent, les jointures de hachage n’étaient pas disponibles dans cette situation).

Le coût d’une jointure de 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 comportant n partitions, la jointure de hachage est exécutée en tant que n jointures de hachage indépendantes. Cela a les effets suivants:

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

Notez que les jointures de hachage ne peuvent être utilisées que pour les équi-jointures, mais que les jointures de fusion sont plus flexibles.

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

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

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

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

Je veux juste éditer ceci pour la postérité que les étiquettes pour l’oracle n’ont pas été ajoutées quand j’ai répondu à cette question. Ma réponse était plus applicable à MS SQL.

La fusion des jointures est la meilleure possible car elle exploite la commande, ce qui permet de transmettre les tables en une seule fois. Si vous avez deux tables (ou des index couvrant) ayant leur ordre identique, comme une clé primaire et un index d’une table sur cette clé, une jointure de fusion se produirait si vous exécutiez cette action.

La jointure par hachage est la meilleure, car elle est généralement effectuée quand une table contient un petit nombre (relativement) d’éléments, ce qui crée une table temporaire avec des hachages pour chaque ligne qui est ensuite recherchée en permanence pour créer la jointure.

Le pire des cas est une boucle nestede qui est order (n * m) ce qui signifie qu’il n’y a pas d’ordre ou de taille à exploiter et que la jointure est simplement, pour chaque ligne de la table x, la table y pour les jointures à faire.