web-dev-qa-db-fra.com

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

Quels sont les gains/pertes de performances entre les jointures de hachage et les jointures de fusion, en particulier dans Oracle RDBMS?

57
Andrew Martinez

Une jointure de "fusion et 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 prohibitif, surtout si le tri déborde 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 proportion élevée de blocs d'une table via une analyse d'index peut également être très coûteux par rapport à une analyse complète de table .

Une jointure de hachage est effectuée en hachant un ensemble de données en mémoire sur la base 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 entièrement conservée en mémoire, le coût total s'élevant à très 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 dans un tri en une seule passe, et augmente considérablement pour un tri multipasse.

(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 petite table pour une jointure de hachage, mais à la plus grande table d'abord 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 dans 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 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, 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è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, les besoins en mémoire sont réduits d'un facteur n et les premières lignes sont projetées à partir de la requête précédente.

Vous devez noter que les jointures de hachage ne peuvent être utilisées que pour les équi-jointures, mais 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, une jointure de hachage sera un meilleur pari.

Cette rubrique est très bien couverte dans la documentation.

http://download.Oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i5152

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

73
David Aldridge

Je veux juste modifier cela pour la postérité que les balises pour Oracle n'ont pas été ajoutées lorsque j'ai répondu à cette question. Ma réponse était plus applicable à MS SQL.

La jointure de fusion est la meilleure possible car elle exploite l'ordre, résultant en un seul passage dans les tables pour effectuer la jointure. SI vous avez deux tables (ou des index couvrant) dont l'ordre est identique, comme une clé primaire et un index d'une table sur cette clé, une jointure de fusion résulterait si vous exécutiez cette action.

La jointure par hachage est la meilleure, car elle est généralement effectuée lorsqu'une table a un nombre (relativement) limité d'éléments, sa création effective d'une table temporaire avec des hachages pour chaque ligne qui est ensuite recherchée en continu pour créer la jointure.

Le pire des cas est une boucle imbriquée qui est un ordre (n * m), ce qui signifie qu'il n'y a pas d'ordre ou de taille à exploiter et la jointure est simplement, pour chaque ligne du tableau x, rechercher dans le tableau y les jointures à faire.

7
Spence