sql >> Database >  >> RDS >> Oracle

Hash join in Oracle met voorbeeld

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.

  1. SQL afstemmen

  2. Plezier met (columnstore) compressie op een hele grote tafel – deel 1

  3. Hoe maak ik een lijst van actieve / open verbindingen in Oracle?

  4. Hoe SQLite Count() werkt