Inhoudsopgave
Wat is hash Join in Oracle?
Hash-joins worden gebruikt wanneer grote tabellen worden samengevoegd of wanneer voor de joins de meeste rijen met samengevoegde tabellen nodig zijn. Dit wordt alleen gebruikt voor gelijke deelnames
Algoritme voor Oracle Hash Join
1) De optimizer gebruikt kleinere van de 2 tabellen om een hashtabel in het geheugen te bouwen. Kleine tabel wordt buildtabel genoemd
Bouwfase
Voor elke rij in een kleine tabellus
Bereken de hash-waarde op de samenvoegingssleutel
Voeg de rij in de juiste hash-bucket in.
Einde lus;
2) scant vervolgens de grote tabellen en vergelijkt de hash-waarde (van rijen uit een grote tabel) met deze hash-tabel om de samengevoegde rijen te vinden. Grote tabel wordt probe-tabel genoemd
Sondefase
Voor elke rij in de grote tabellus
Bereken de hash-waarde op de join-sleutel
Probeer de hash-tabel voor de hash-waarde
Als er een overeenkomst is gevonden
Retourneer rijen
Einde lus;
De bovenstaande uitleg is waar wanneer de hash-tabel die wordt ontwikkeld, volledig in het geheugen past. Als de hash-tabel te groot is om in het beschikbare geheugen te passen, doet Oracle de verwerking op een iets andere manier.
In principe als de hash-tabel is te groot om in het beschikbare geheugen te passen Oracle heeft een mechanisme om het in batches op schijf op te slaan (partities genoemd) en de testtabel op schijf op te slaan in overeenkomende batches, en vervolgens de samenvoeging stuksgewijs tussen overeenkomende batches te doen
Als het hash-gebied vol raakt, moet Oracle de TEMP-tabelruimte gebruiken. Oracle kiest de grootste partitie met in de hash en schrijft die naar TEMP. Oracle houdt een bitmap-achtige index van de hele hashtabel in het geheugen. Deze index weet alleen dat er voor een bepaalde hash-bucket (locatie in de hashtabel) wel of geen waarde is. Maar de index heeft niet de werkelijke waarde.
Dus als een rij van de tweede of onderzoekstabel hasht naar een van deze locaties, is het enige dat bekend is dat er een potentiële match is. Het proces van het bouwen van een hashtabel gaat door totdat de hele hashtabel is voltooid. Een deel van de hashtabel staat in het geheugen en een deel staat op schijf
Nu begint het Oracle de sonde of andere tabel te lezen en begint met het maken van de hash van de join-sleutel. Als de hash-sleutel overeenkomt met de hash in het geheugen, is de join voltooid en wordt de rij geretourneerd. Als de rij de potentiële match is, dan orakel zal deze rij opslaan in de TEMP-tabelruimte in hetzelfde partitieschema als de eerste rijgegevens werden bewaard.
Zodra de eerste doorgang van de gehele secundaire tabel is voltooid en alle rijen in de hashtabel in het geheugen zijn gegeven, zal Oracle beginnen te kijken naar de overeenkomende partitie op de schijf en elke partitie één voor één verwerken en de rijen in het geheugen lezen en de output verwerken
Hash join Oracle Voorbeeld:
select /* +use_hash( a b) */ a.emp_no,b.dept_no,b.dept_name from emp a,dept b where a.dept_no=b.dept_no; Plan ------------------------------------------------- SELECT STATEMENT HASH JOIN TABLE ACCESS FULL EMP TABLE ACCESS FULL DEPT
Hoe hash-join in Oracle wordt verwerkt
1) De eerste EMP-tabel wordt gescand en gehasht
2) de dept-tabel wordt gescand voor elke rij en er wordt een hash gemaakt voor het bewaren van de join dept_no
3) dept_no hash komt overeen in de hash-tabel , als een overeenkomst wordt gevonden, worden samengevoegde rijen geretourneerd
oracle hash join-hint
Oracle heeft de hint use_hash gegeven om het gebruik van hash-join af te dwingen.
Usage select /* +use_hash(table alias) */ ......
Dit vertelt de optimizer dat de join-methode die moet worden gebruikt wanneer "table_alias" de volgende rijbron in de join-volgorde is, een hash-join moet zijn; het vertelt de optimizer echter niet of die rijbron moet worden gebruikt als de bouwtabel of de testtabel.
Om aan te geven hoe de rijbron wordt gebruikt, hebt u een tweede hint nodig:no_swap_join_inputs(“table_alias”) als u wilt dat Oracle de rijbron gebruikt als de testtabel, of swap_join_inputs(“table_alias”) als u wilt dat Oracle het gebruikt als de build tafel
Enkele belangrijke punten over hash join in Oracle
1) De output van het hash-joinresultaat is niet onmiddellijk omdat hash-joining wordt geblokkeerd bij het opbouwen van een hashtabel. Zodra de hash-tabelopbouw is voltooid, worden de rijen sneller geretourneerd
2)hash-joins worden vaak gezien met ALL_ROWS-optimizer modus, omdat het werkt op het model van het tonen van resultaten nadat alle rijen van ten minste één van de tabellen zijn gehasht in de hash-tabel.
3) De hash-tabel is het privégeheugen, dus toegang tot gegevens brengt niet veel vergrendelingsactiviteit met zich mee
Kosten van de hash-join =Kosten van het lezen van tabel A +kosten van het lezen van tabel B + wat kleine verwerking in het geheugen
Verschil tussen geneste lus en hash-join
Hash Join | Geneste deelname |
Hash-joins worden gebruikt wanneer grote tabellen worden samengevoegd of wanneer voor de joins de meeste rijen met gekoppelde tabellen nodig zijn. Dit wordt alleen gebruikt voor gelijke deelnames | De NESTED LOOPS Join is een join-bewerking die een rij selecteert uit de geselecteerde beginrijbron en de waarden van deze rijbron gebruikt om naar de gekoppelde rijbron te rijden of te selecteren uit de gekoppelde rijbron om naar de overeenkomende rij te zoeken. -Het beste voor transacties van het OLTP-type |
Hash-bewerking is normaal gesproken efficiënt voor de twee datasets wanneer veel records worden geretourneerd. | Als een dataset geen of een klein aantal records heeft geretourneerd en een andere dataset kan worden vergeleken met behulp van indexbewerking, dan is geneste lus-join efficiënter |
Mogelijk ziet u meer hash-joins die worden gebruikt met de ALL_ROWS-optimalisatiemodus, omdat het werkt op het model van het weergeven van resultaten nadat alle rijen van ten minste één van de tabellen zijn gehasht in de hashtabel. | U zult meer gebruik van geneste lus zien wanneer u de FIRST_ROWS-optimalisatiemodus gebruikt, omdat dit werkt op het model van het tonen van onmiddellijke resultaten aan de gebruiker wanneer ze worden opgehaald. Het is niet nodig om gegevens in de cache te selecteren voordat deze worden teruggestuurd naar de gebruiker. In het geval van een hash-join is dit nodig en wordt hieronder uitgelegd. |