Hash bli med - Hash join

Den hash delta er et eksempel på en delta algoritme og brukes i gjennomføringen av et relasjonsdatabasesystem . Alle varianter av hash-sammenkoblingsalgoritmer involverer å bygge hash-tabeller fra tuplene til den ene eller begge de sammenføyde relasjonene, og deretter undersøke disse tabellene, slik at bare tupler med samme hash-kode må sammenlignes for likeverd i equijoins.

Hash-sammenføyninger er vanligvis mer effektive enn nestede loops-sammenføyninger, bortsett fra når sondesiden av skjøten er veldig liten. De krever et equijoin- predikat (et predikat som sammenligner poster fra den ene tabellen med de fra den andre tabellen ved hjelp av en kombinasjon av likhetsoperatører '=' i en eller flere kolonner).

Klassisk hash-sammenføyning

Den klassiske hash-sammenkoblingsalgoritmen for en indre sammenføyning av to forhold fortsetter som følger:

  • Først må du lage en hash-tabell ved hjelp av innholdet i en relasjon, ideelt sett hvilken som er mindre etter å ha brukt lokale predikater. Denne relasjonen kalles byggesiden av skjøten. Den nummertabellen oppføringer er avbildninger fra verdien av (kompositt) delta attributt til de gjenværende attributtene for den raden (avhengig av hva som er nødvendig).
  • Når hash-tabellen er bygget, skann den andre relasjonen (sonden). For hver rad i probeforholdet, finn de aktuelle radene fra byggeforholdet ved å se i hash-tabellen .

Den første fasen kalles vanligvis "bygg" -fasen , mens den andre kalles "sonde" -fasen . På samme måte kalles koblingsforholdet som hash-tabellen er bygget på, "build" -inngangen, mens den andre inngangen kalles "probe" -inngangen.

Denne algoritmen er enkel, men det krever at den mindre sammenføyningsforholdet passer inn i minnet, noe som noen ganger ikke er tilfelle. En enkel tilnærming til å håndtere denne situasjonen forløper som følger:

  1. For hver tuple i byggeinngangen
    1. Legg til hash-tabellen i minnet
    2. Hvis størrelsen på hashtabellen tilsvarer den maksimale minnestørrelsen:
      1. Skann sondeinngangen , og legg til matchende sammenføyningstykker i utgangsforholdet
      2. Tilbakestill hash-tabellen, og fortsett å skanne byggeinngangen
  2. Gjør en siste skanning av sondeinngangen og legg til de resulterende sammenføyningstubbene i utgangsforholdet

Dette er i det vesentlige det samme som algoritmen for sammenkobling av sløyfe . Denne algoritmen skanner til slutt flere ganger enn nødvendig.

Grace hash bli med

En bedre tilnærming er kjent som "grace hash join", etter GRACE-databasemaskinen som den først ble implementert for.

Denne algoritmen unngår å skanne hele forholdet ved å først partisjonere både og via en hash-funksjon, og skrive disse partisjonene ut på disken. Algoritmen laster deretter par av partisjoner i minnet, bygger en hash-tabell for den mindre partisjonerte relasjonen, og sonderer den andre relasjonen for treff med den nåværende hash-tabellen. Fordi partisjonene ble dannet av hashing på sammenføyningsnøkkelen, må det være slik at alle sammenføyningsutgangstykker må tilhøre samme partisjon.

Det er mulig at en eller flere av partisjonene fremdeles ikke passer inn i det tilgjengelige minnet, i hvilket tilfelle algoritmen brukes rekursivt: en ekstra ortogonal hashfunksjon velges for å hashe den store partisjonen til underpartisjoner, som deretter behandles som før. Siden dette er dyrt, prøver algoritmen å redusere sjansen for at det vil oppstå ved å danne de minste partisjonene som er mulig i den første partisjonsfasen.

Hybrid hash blir med

Hybrid-hash-sammenkoblingsalgoritmen er en raffinement av nåde-hash-sammenføyningen som utnytter mer tilgjengelig minne. I løpet av partisjonsfasen bruker hybrid hash-koblingen tilgjengelig minne for to formål:

  1. Å holde gjeldende utgangsbufferside for hver av partisjonene
  2. For å holde en hel partisjon i minnet, kjent som "partisjon 0"

Fordi partisjon 0 aldri blir skrevet til eller lest fra disk, utfører hybrid hash-join vanligvis færre I / O-operasjoner enn grace hash-join. Merk at denne algoritmen er minnesensitiv, fordi det er to konkurrerende krav til minne (hash-tabellen for partisjon 0, og utgangsbufferne for de gjenværende partisjonene). Å velge for stor hash-tabell kan føre til at algoritmen går tilbake fordi en av partisjonene som ikke er null, er for stor til å passe inn i minnet.

Hash anti-bli med

Hash-sammenføyninger kan også evalueres for et antikoblingspredikat (et predikat som velger verdier fra den ene tabellen når ingen relaterte verdier finnes i den andre). Avhengig av størrelsen på tabellene, kan forskjellige algoritmer brukes:

Hash forlot anti-join

  • Forbered et hasjbord for NOT IN- siden av skjøten.
  • Skann den andre tabellen, og velg hvilke rader hvor tilknytningsattributtet hashes til en tom oppføring i hash-tabellen.

Dette er mer effektivt når NOT IN- tabellen er mindre enn FROM- tabellen

Hash høyre anti-join

  • Forbered et hasjbord for FRA siden av skjøten.
  • Skann NOT IN- tabellen, og fjern de tilsvarende postene fra hash-tabellen på hvert hash-treff
  • Returner alt som er igjen i hasjetabellen

Dette er mer effektivt når NOT IN- tabellen er større enn FROM- tabellen

Hash semi-delta

Hash semi-join brukes til å returnere postene som er funnet i den andre tabellen. I motsetning til vanlig sammenføyning, returnerer den bare alle poster fra ledertabellen en gang, ikke med tanke på hvor mange kamper som er i IN- tabellen.

Som med anti-join kan semi-join også være venstre og høyre:

Hash has semi-join

  • Forbered et hasjbord for IN- siden av skjøten.
  • Skann den andre tabellen og returner eventuelle rader som gir et hash-treff.

Platene returneres rett etter at de produserte en hit. De faktiske postene fra hashtabellen ignoreres.

Dette er mer effektivt når IN- tabellen er mindre enn FROM- tabellen

Hash høyre semi-delta

  • Forbered et hasjbord for FRA siden av skjøten.
  • Skann IN- tabellen, returner tilsvarende poster fra hash-tabellen og fjern dem

Med denne algoritmen kan hver post fra hash-tabellen (det vil si FROM- tabellen) bare returneres en gang, siden den fjernes etter at den er returnert.

Dette er mer effektivt når IN- tabellen er større enn FROM- tabellen

Se også

Referanser

  1. ^ DeWitt, DJ; Katz, R .; Olken, F .; Shapiro, L .; Stonebraker, M .; Wood, D. (juni 1984). "Implementeringsteknikker for hovedminnedatabasesystemer". Proc. ACM SIGMOD Conf . 14 (4): 1–8. doi : 10.1145 / 971697.602261 .

Eksterne linker