Quels sont les gains / pertes de performance entre les jointures de hachage et les jointures de fusion, en particulier dans le SGBDR Oracle?
Réponses
Trop de publicités?Une "sorte de fusion" jointure est effectuée par un tri des deux ensembles de données pour être rejoint en fonction de la jointure touches et puis les fusionner ensemble. La fusion est très bon marché, mais le genre peut être très cher, surtout si le tri des déversements sur le disque. Le coût de la sorte peut être abaissé si l'un des ensembles de données peuvent être consultées dans l'ordre de tri par le biais d'un indice, bien que l'accès à une forte proportion de blocs d'une table via une analyse d'index peut aussi être très coûteux par rapport à un full table scan.
Une jointure de hachage est effectuée par le hachage d'un ensemble de données dans la mémoire basé sur les colonnes de jointure et de la lecture de l'autre et d'approfondissement de la table de hachage pour les matchs. La jointure de hachage est très faible coût lorsque la table de hachage peut être tenu entièrement en mémoire, avec le coût total s'élevant à très peu plus que le coût de lire les ensembles de données. Le coût s'élève si la table de hachage doit être renversé sur le disque en une seule passe de tri, et augmente considérablement pour un multipass tri.
Le coût d'une jointure de hachage peut être réduit par le partitionnement des deux tables sur la clé de jointure(s). Cela permet à l'optimiseur d'en déduire que les lignes d'une partition dans un tableau n'trouver une correspondance dans une partition donnée de l'autre table, et pour les tables ayant n partitions de la jointure de hachage est exécuté en tant que n indépendants les jointures de hachage. Ce a les effets suivants:
- La taille de chaque table de hachage est réduite, et donc de réduire au maximum la quantité de mémoire requise et, potentiellement, en supprimant la nécessité pour le fonctionnement d'exiger de l'espace disque temporaire.
- Requêtes en parallèle des opérations de la quantité de l'inter-processus de messagerie est considérablement réduit, réduction de l'utilisation de l'UC et de l'amélioration de la performance, comme chaque jointure de hachage peut être effectuée par une paire de PQ processus.
- Pour les non-requête parallèle des opérations de la mémoire requise est réduite par un facteur de n, et les premières lignes sont projetées à partir de la requête précédente.
Vous devriez noter que les jointures de hachage peut être utilisé uniquement pour les équi-jointures, mais jointures de fusion sont plus souples.
En général, si vous vous joignez à de grandes quantités de données dans une équi-jointure puis une jointure de hachage va être 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
Je veux juste modifier ce pour la postérité que les balises pour oracle ne sont pas ajoutés lorsque j'ai répondu à cette question. Ma réponse était plus applicable à MS SQL.
Jointure de fusion est la meilleure possible car il exploite la commande, résultant en une seule passe vers le bas les tables pour faire la jointure. SI vous avez deux tables (ou la couverture des index) qui ont leur de la commande de la même comme une clé primaire et d'un index d'une table sur cette touche puis une jointure de fusion serait le résultat si vous avez effectué cette action.
Jointure de hachage est la meilleure, comme ce qui se fait habituellement, quand un tableau est un petit nombre (relativement) d'articles, de ses effectivement la création d'une table temporaire avec des hachages pour chaque ligne qui est ensuite cherché en permanence à créer de la jointure.
Pire des cas, la boucle imbriquée qui est de l'ordre (n * m), ce qui signifie il n'y a pas de commande ou de la taille de l'exploiter et de le rejoindre est tout simplement, pour chaque ligne dans le tableau x, table de recherche pour y rejoint à faire.