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:
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.