Hash join - Hash join

Hash se alăture este un exemplu de un alătura algoritm și este utilizat în punerea în aplicare a unui relaționale sistem de management de baze de date . Toate variantele algoritmilor de îmbinare hash implică construirea de tabele hash din tuplurile uneia sau ambelor relații unite și ulterior sondarea acelor tabele astfel încât numai tuplurile cu același cod hash trebuie comparate pentru egalitate în echijoins.

Îmbinările hash sunt de obicei mai eficiente decât îmbinările buclelor imbricate, cu excepția cazului în care partea sondei îmbinării este foarte mică. Acestea necesită un predicat echijoin (un predicat care compară înregistrările dintr-un tabel cu cele din celălalt tabel utilizând o conjuncție de operatori de egalitate '=' pe una sau mai multe coloane).

Alăturare clasică hash

Algoritmul clasic hash join pentru o îmbinare interioară a două relații se desfășoară după cum urmează:

  • În primul rând, pregătiți un tabel hash folosind conținutul unei relații, în mod ideal oricare dintre acestea este mai mică după aplicarea predicatelor locale. Această relație se numește partea de construcție a îmbinării. În tabel hash intrările sunt mapări din valoarea (compozite) se alăture atribut la atributele rămase din acel rând (oricare dintre acestea este nevoie de cele).
  • Odată ce tabelul hash este construit, scanați cealaltă relație (partea sondei). Pentru fiecare rând al relației sondă, găsiți rândurile relevante din relația de construire uitându-vă în tabelul hash .

Prima fază se numește de obicei faza „construire” , în timp ce a doua este numită faza „sondă” . În mod similar, relația de îmbinare pe care este construită tabelul hash se numește intrarea „build”, în timp ce cealaltă intrare se numește intrarea „probe”.

Acest algoritm este simplu, dar necesită ca relația de îmbinare mai mică să se potrivească în memorie, ceea ce uneori nu este cazul. O abordare simplă de gestionare a acestei situații are loc după cum urmează:

  1. Pentru fiecare tuplu din intrarea de construire
    1. Adăugați la tabelul hash din memorie
    2. Dacă dimensiunea tabelului hash este egală cu dimensiunea maximă în memorie:
      1. Scanați intrarea sondei și adăugați tupluri de îmbinare potrivite la relația de ieșire
      2. Resetați tabelul de hash și continuați să scanați intrarea de construire
  2. Efectuați o scanare finală a intrării sondei și adăugați tuplurile de îmbinare rezultate la relația de ieșire

Acesta este în esență același cu algoritmul de îmbinare în buclă imbricată . Acest algoritm scanează în cele din urmă de mai multe ori decât este necesar.

Grace hash se alătură

O abordare mai bună este cunoscută sub numele de "grace hash join", după mașina de baze de date GRACE pentru care a fost implementată prima dată.

Acest algoritm evită scanarea completă a întregii relații prin prima partiționare atât prin intermediul unei funcții hash, cât și prin scrierea acestor partiții pe disc. Algoritmul încarcă apoi perechi de partiții în memorie, construiește un tabel hash pentru relația partiționată mai mică și sondează cealaltă relație pentru potrivirile cu tabelul hash curent. Deoarece partițiile au fost formate prin hashing pe cheia de asociere, trebuie să fie cazul în care orice tupluri de ieșire de asociere trebuie să aparțină aceleiași partiții.

Este posibil ca una sau mai multe partiții să nu se încadreze în memoria disponibilă, caz în care algoritmul este aplicat recursiv: se alege o funcție de hash ortogonală suplimentară pentru a hashiza partiția mare în sub-partiții, care sunt apoi procesate ca inainte de. Deoarece acest lucru este costisitor, algoritmul încearcă să reducă șansele ca acesta să apară formând cele mai mici partiții posibile în timpul fazei inițiale de partiționare.

Hibrid hash join

Algoritmul de îmbinare hash hibrid este un rafinament al îmbinării hash grație care profită de mai multă memorie disponibilă. În timpul fazei de partiționare, îmbinarea hash hibridă utilizează memoria disponibilă în două scopuri:

  1. Pentru a menține pagina de buffer de ieșire curentă pentru fiecare dintre partiții
  2. Pentru a păstra o întreagă partiție în memorie, cunoscută sub numele de "partiție 0"

Deoarece partiția 0 nu este niciodată scrisă sau citită de pe disc, îmbinarea hash hibridă efectuează de obicei mai puține operațiuni I / O decât îmbinarea hash grație. Rețineți că acest algoritm este sensibil la memorie, deoarece există două cerințe concurente pentru memorie (tabelul hash pentru partiția 0 și tampoanele de ieșire pentru partițiile rămase). Alegerea unui tabel hash prea mare poate determina recurgerea algoritmului, deoarece una dintre partițiile diferite de zero este prea mare pentru a se potrivi în memorie.

Hash anti-aderare

Îmbinările hash pot fi, de asemenea, evaluate pentru un predicat anti-unire (un predicat care selectează valori dintr-un tabel atunci când în celălalt nu se găsesc valori conexe). În funcție de dimensiunile tabelelor, pot fi aplicați diferiți algoritmi:

Hash a părăsit anti-aderarea

  • Pregătiți un tabel hash pentru partea NOT IN a îmbinării.
  • Scanați celălalt tabel, selectând orice rânduri în care atributul de îmbinare hashează la o intrare goală din tabelul de hash.

Acest lucru este mai eficient atunci când tabelul NOT IN este mai mic decât tabelul FROM

Hash dreapta anti-aderare

  • Pregătiți un tabel hash pentru partea FROM a îmbinării.
  • Scanați tabelul NOT IN , eliminând înregistrările corespunzătoare din tabelul hash de la fiecare hit hash
  • Întoarceți tot ce a rămas în tabelul hash

Acest lucru este mai eficient atunci când tabelul NOT IN este mai mare decât tabelul FROM

Hash semi-join

Hash semi-join este folosit pentru a returna înregistrările găsite în celălalt tabel. Spre deosebire de unirea simplă, acesta returnează fiecare înregistrare de potrivire din tabelul principal o singură dată, indiferent de câte meciuri există în tabelul IN .

La fel cu anti-join, semi-join poate fi, de asemenea, la stânga și la dreapta:

Hash a părăsit semiunirea

  • Pregătiți un tabel hash pentru partea IN a îmbinării.
  • Scanați celălalt tabel, returnând orice rânduri care produc un hit hash.

Înregistrările sunt returnate imediat după ce au produs un hit. Înregistrările reale din tabelul hash sunt ignorate.

Acest lucru este mai eficient atunci când tabelul IN este mai mic decât tabelul FROM

Hash semi-join dreapta

  • Pregătiți un tabel hash pentru partea FROM a îmbinării.
  • Scanați tabelul IN , returnând înregistrările corespunzătoare din tabelul hash și îndepărtându-le

Cu acest algoritm, fiecare înregistrare din tabelul hash (adică din tabelul FROM ) poate fi returnată o singură dată, deoarece este eliminată după returnare.

Acest lucru este mai eficient atunci când tabelul IN este mai mare decât tabelul FROM

Vezi si

Referințe

  1. ^ DeWitt, DJ; Katz, R .; Olken, F .; Shapiro, L .; Stonebraker, M .; Wood, D. (iunie 1984). "Tehnici de implementare pentru principalele sisteme de baze de date de memorie". Proc. ACM SIGMOD Conf . 14 (4): 1-8. doi : 10.1145 / 971697.602261 .

linkuri externe