sql >> Databasteknik >  >> RDS >> Oracle

Hash gå med i Oracle med exempel

Innehållsförteckning

Vad är hash Gå med i Oracle?

Hash-kopplingar används när de sammanfogar stora tabeller eller när sammanfogningarna kräver de flesta av de sammanfogade tabellraderna. Detta används endast för jämställdhetsanslutningar

Algorithm for Oracle Hash Join

1) Optimizern använder mindre av de 2 tabellerna för att bygga en hashtabell i minnet. Liten tabell kallas byggtabell

Byggfas

För varje rad i liten tabellslinga
Beräkna hash-värde på join-nyckel
Infoga rad i lämplig hash-bucket.
Avsluta loop;

2) skannar sedan de stora tabellerna och jämför hashvärdet (för rader från stora tabeller) med denna hashtabell för att hitta de sammanfogade raderna. Stor tabell kallas probetabell

Sondfas

För varje rad i stor tabellloop
Beräkna hashvärdet på join-nyckeln
Sök hashtabellen för hashvärde
Om matchning hittas
Returnera rader
Avsluta loop;

Ovanstående förklaring är sann när hashtabellen som utvecklas passar helt och hållet i minnet. om hashtabellen är för stor för att få plats i det tillgängliga minnet, så gör Oracle bearbetningen på lite annorlunda sätt.
I princip om hashtabellen är för stor för att få plats i det tillgängliga minnet Oracle har en mekanism för att spara det på skiva i batcher (kallade partitioner) och spara sondtabellen på skiva i matchande batcher, och sedan göra sammanfogningen mellan matchande batcher

När hashområdet fylls upp kommer Oracle att behöva använda TEMP tablespace. Oracle kommer att välja den största partitionen med i hashen och skriva det till TEMP. Oracle håller ett bitmappsliknande index över hela hashtabellen i minnet. Det här indexet vet bara att det för en given hash-bucket (plats i hashtabellen) finns eller inte finns ett värde. Men indexet har inte det faktiska värdet.

Om en rad från den andra eller sonderingstabellen hash till en av dessa platser är det enda som är känt att det finns en potentiell matchning. Processen att bygga hashtabellen fortsätter tills hela hashtabellen är klar. En del av hashtabellen finns i minnet och en del finns på disk

Nu börjar Oracle läsa sonden eller någon annan tabell och börja skapa hashen för join-nyckeln. Om hash-nyckeln matchar hash-nyckeln i minnet, då är joinningen slutförd och raden returneras. Om raden är den potentiella matchningen så är oracle kommer att lagra den här raden på TEMP-tabellutrymmet i samma partitioneringsschema som den första radens data behölls.

När den första passagen av hela den sekundära tabellen är klar och alla rader i hashtabellen i minnet är givna, kommer Oracle att börja titta på den matchande partitionen på disken och den kommer att bearbeta varje partition en efter en och läsa raderna i minnet och bearbeta utdata

Hash join Oracle Exempel:

välj /* +use_hash( a b) */ a.emp_no,b.dept_no,b.dept_name från emp a,dept b där a.dept_no=b.dept_no;Plan----- ---------------------------------------VÄLJ STATEMENTHASH JOINTABLE ACCESS FULL TÖMBAR ÅTKOMST FULL AVDELNING 

Hur bearbetas Hash-anslutning i Oracle
1) Första EMP-tabellen skannas och hashas
2) avd.tabellen skannas för varje rad och hash skapas för sammanfogningen som håller dept_no
3) dept_no hash matchas i hashtabellen , om en matchning hittas returneras sammanfogade rader

oracle hash-anslutningstips 

Oracle har gett tipset use_hash för att tvinga fram användningen av hash-join.

Usageselect /* +use_hash(tabellalias) */ ......

Detta talar om för optimeraren att joinmetoden som ska användas när "table_alias" är nästa radkälla i joinordningen ska vara en hash-join; den talar dock inte om för optimeraren om den radkällan ska användas som byggtabell eller sondtabell.

För att specificera hur radkällan används behöver du en andra ledtråd:no_swap_join_inputs(“table_alias”) om du vill att Oracle ska använda radkällan som probetabell, eller swap_join_inputs(“table_alias”) om du vill att Oracle ska använda den som konstruktion bord

Några viktiga punkter om hash-anslutning i Oracle

1) Utdata från hash-join-resultat är inte omedelbar eftersom hash-joining blockeras vid uppbyggnad av hash-tabell. När hash-tabellbygget är färdigt returneras raderna snabbare
2)hash-joins ses vanligtvis med ALL_ROWS optimizer läge, eftersom det fungerar på en modell för att visa resultat efter att alla rader i minst en av tabellerna hashas i hashtabell.
3)Hashtabell är det privata minnet så att åtkomst till data inte medför mycket låsningsaktivitet

Kostnad för hash-join =Kostnad för läsning av tabell A +kostnad för lästabell B + lite bearbetning i minnet

Skillnaden mellan Nested Loop och Hash Join

Hash Join Nested Join
Hash-kopplingar används när de sammanfogar stora tabeller eller när sammanfogningarna kräver de flesta av de sammanfogade tabellraderna. Detta används endast för jämställdhetsanslutningar NESTED LOOPS Join är en sammanfogningsoperation som väljer en rad från den valda början av radkällan och använder värdena för denna radkälla för att köra in i eller välja från den sammanfogade radkällan och söka efter den matchande raden.
-Bäst för OLTP-transaktioner
Hash-drift är normalt effektiv för de två datamängderna när många poster returneras. När en datauppsättning har inga eller ett fåtal o poster returnerade och andra datauppsättningar kan matchas med hjälp av indexoperation, är Nested loop join effektivare
Du kan se fler hash-kopplingar som används med ALL_ROWS optimeringsläge, eftersom det fungerar på modell för att visa resultat efter att alla rader i minst en av tabellerna hashas i hashtabellen. Du kommer att se mer användning av kapslad loop när du använder FIRST_ROWS optimeringsläge eftersom det fungerar på modellen för att visa omedelbara resultat för användaren när de hämtas. Det finns inget behov av att välja caching av data innan den returneras till användaren. I händelse av hash join behövs det och förklaras nedan.

  1. MySql Count kan inte visa 0-värden

  2. SQL Server 2016:View Designer

  3. Finns det något sätt att inaktivera funktionsöverbelastning i Postgres

  4. Hur man undertrycker INFO-meddelanden när man kör psql-skript