Indholdsfortegnelse
Hvad er hash Deltag i Oracle?
Hash-sammenføjninger bruges, når de sammenføjede store tabeller, eller når sammenføjningerne kræver de fleste af de sammenføjede tabelrækker. Dette bruges kun til ligestillingstilslutninger
Algorithm for Oracle Hash Join
1) Optimizeren bruger den mindste af de 2 tabeller til at bygge en hash-tabel i hukommelsen. Lille tabel kaldes build table
Byggefase
For hver række i lille tabelløkke
Beregn hashværdi på joinnøgle
Indsæt række i passende hash-bøtte.
Afslut loop;
2)scanner derefter de store tabeller og sammenligner hash-værdien (af rækker fra stor tabel) med denne hash-tabel for at finde de sammenføjede rækker. Stor tabel kaldes probe-tabel
Probefase
For hver række i stor tabelløkke
Beregn hashværdien på joinnøgle
Søg hashtabellen for hashværdi
Hvis match fundet
Returner rækker
Afslut loop;
Ovenstående forklaring er sand, når hashtabellen, der udvikles, passer helt ind i hukommelsen. Hvis hashtabellen er for stor til at passe i den tilgængelige hukommelse, så udfører Oracle behandlingen på en lidt anderledes måde.
Grundlæggende hvis hashtabellen er for stor til at passe i den tilgængelige hukommelse Oracle har en mekanisme til at gemme den på disk i batches (kaldet partitioner) og gemme sondetabellen på disk i matchende batches, og derefter udføre sammenføjningen stykkevis mellem matchende batches
Dybest set når hash-området fyldes op, vil Oracle kræve at bruge TEMP tablespace. Oracle vil vælge den største partition med i hashen og skrive det til TEMP. Oracle holder et bitmap-lignende indeks over hele hash-tabellen i hukommelsen. Dette indeks ved kun, at der for en given hash-bucket (placering i hash-tabellen) er eller ikke er en værdi. Men indekset har ikke den faktiske værdi.
Hvis en række fra den anden eller sonderingstabel hashes til en af disse placeringer, er det eneste, man ved, at der er et potentielt match. Processen med at bygge hash-tabellen fortsætter, indtil hele hash-tabellen er færdig. En del af hash-tabellen er i hukommelsen, og en del er på disken
Nu begynder Oracle at læse sonden eller en anden tabel og begynde at oprette hashen af join-nøglen. Hvis hash-nøglen matcher hashen i hukommelsen, er joinforbindelsen fuldført, og rækken returneres. Hvis rækken er den potentielle match, så oracle vil gemme denne række på TEMP-tablespacet i det samme partitioneringsskema, som dataene i den første række blev opbevaret.
Når den første passage af hele den sekundære tabel er udført, og alle rækkerne i hash-tabellen i hukommelsen er givet, vil Oracle begynde at se på den matchende partition på disken, og den vil behandle hver partition en efter en og læse rækkerne i hukommelsen og behandle outputtet
Hash join Oracle Eksempel:
vælg /* +use_hash( a b) */ a.emp_no,b.dept_no,b.dept_name fra emp a,dept b hvor a.dept_no=b.dept_no;Plan---- ---------------------------------------VÆLG STATEMENTHASH JOINTABLE ACCESS FULD TØMbar ADGANG FULD DEPTSådan behandles Hash-join i Oracle
1) Første EMP-tabel scannes og hash
2) dept-tabellen scannes for hver række, og hash oprettes til join-holder dept_no
3) dept_no hash matches i hash-tabellen , hvis der findes et match, returneres sammenføjede rækkeroracle hash join-tip
Oracle har givet hintet use_hash for at tvinge brugen af hash-join.
Usageselect /* +use_hash(tabelalias) */ ......Dette fortæller optimizeren, at joinmetoden, der skal bruges, når "table_alias" er den næste rækkekilde i joinrækkefølgen, skal være en hash-join; den fortæller dog ikke optimeringsværktøjet, om denne rækkekilde skal bruges som byggetabellen eller probetabellen.
For at specificere, hvordan rækkekilden bruges, har du brug for et andet tip:no_swap_join_inputs(“table_alias”), hvis du ønsker, at Oracle skal bruge rækkekilden som probetabellen, eller swap_join_inputs(“table_alias”), hvis du ønsker, at Oracle skal bruge den som build. bord
Nogle vigtige punkter om hash-deltagelse i Oracle
1) Outputtet af hash-join-resultatet er ikke øjeblikkeligt, da hash-joining er blokeret ved opbygning af hash-tabel. Når hash-tabellen er færdiggjort, returneres rækkerne hurtigere
2)hash joins ses almindeligvis med ALL_ROWS optimizer tilstand, fordi den fungerer på en model, der viser resultater, efter at alle rækkerne i mindst én af tabellerne er hash-kodet i hash-tabel.
3)Hash-tabel er den private hukommelse, så adgang til data medfører ikke megen låsende aktivitetPris for hash-join =Omkostninger ved læsning af tabel A +omkostninger ved læsning af tabel B + lidt behandling i hukommelsen
Forskel mellem Nested Loop og Hash Join
Hash Join | Indlejret deltagelse |
Hash-sammenføjninger bruges, når de sammenføjede store tabeller, eller når sammenkædningen kræver de fleste af de sammenføjede tabelrækker. Dette bruges kun til ligestillingsforbindelser | Den NESTED LOOPS Join er en join-operation, der vælger en række fra den valgte begyndelsesrækkekilde og bruger værdierne for denne rækkekilde til at køre ind i eller vælge fra den sammenføjede rækkekilde, der søger efter den matchende række. -Bedst til OLTP-transaktioner |
Hash-drift er normalt effektiv for de to datasæt, når en masse poster returneres. | Når ét datasæt har ingen eller et lille antal o poster returneret, og andre datasæt kan matches ved hjælp af indeksoperation, så er Nested loop join mere effektiv |
Du kan muligvis se flere hash-sammenføjninger brugt med ALL_ROWS-optimeringstilstand, fordi det fungerer på en model, der viser resultater, efter at alle rækkerne i mindst én af tabellerne er hash-tablet. | Du vil se mere brug af indlejret løkke, når du bruger FIRST_ROWS-optimeringstilstand, da den fungerer på en model, der viser øjeblikkelige resultater til brugeren, efterhånden som de hentes. Der er ikke behov for at vælge caching af data, før de returneres til brugeren. I tilfælde af hash join er det nødvendigt og forklares nedenfor. |