as 2 Implementcia operci relanej algebry Slavomr Stramba

Časť 2 Implementácia operácií relačnej algebry Slavomír Stramba 2003

Úvod Relačný SRBD musí obsahovať metódy, resp. algoritmy implementujúce jednotlivé relačné operácie, ktoré sa môžu vyskytovať v požiadavkách (queries). Okrem základných relačných operácií musí SRBD vedieť spracovávať aj ich kombinácie, a mal by mať dostupné metódy na vykonávanie špeciálnych operácií akými sú napr. agregačné funkcie. V SRBD je pre každú operáciu implementovaná jedna alebo viacero procedúr, vykonavajúca príslušnú operáciu. Niektoré procedúry môžu vyžadovať čiastočné uložné štruktúry a prístupové cesty (napr. indexové súbory) – v tomto prípade môžu byť procedúry použité len ak súbory vystupujúce v operácii majú tieto prístupové cesty. Existuje viacero štandartných procedúr (rutín), ktoré implementujú nasledujúce relačné operácie : • selection • join • project • množinové operácie (union, intersection, product, difference) • kombinácia dvoch operácii. 2

Implementácia Join-u • jedna z časovo najnáročnejších a najdrahšich operácii • najčastejšie používané techniky na implementáciu join-ov (two-way joins) : • Nested loops (brute force) • Index lookup • Hash lookup • Merge • Hash • join by mohol byť implementovaný aj ako karteziánsky súčin s následnou selekciou – priestorovo a časovo asi najnáročnejšia technika implementácie. • v ďalšom texte ohľadom join-u sa bude predpokladať, že existujú 2 relácie R a S, pričom : • M stránok v R, pr záznamov na stránke • N stránok v S, ps záznamov na stránke 3

Simple Nested Loops Join • Každý záznam z vonkajšej relácie R porovnávame s každým záznamom patriacim do vnútornej relácie S. • Cena : M+pr*M*N I/O operácií • Page-oriented nested loops join – pre každú stránku z R sa vezme každá stránka z S a na výstup sa zapíšu zodpovedajúce dvojice záznamov <r, s>, kde r je v Rstránke a s je v S-stránke. • Cena : M+M*N • výhodnejšie je zvoliť ako vonkajšiu reláciu tú, ktorá je menšia 4

Index Nested Loops Join • Ak existuje index na join stĺpci jednej relácie (nech to je S), potom túto reláciu zahrnieme do vnútorného cyklu a využijeme výhody indexu. • Cena : M+M*pr*(cena nájdenia zodpovedajúcich S záznamov) • Pre každý R záznam je cena prešetrenia S indexu okolo 1. 2 pre hash index a 2 -4 pre B+ stromy. Cena nájdenia S záznamov závisí od clustering-u. 5

Block Nested Loops Join Používa jednu stránku ako vstupný buffer na prezeranie vnútornej relácie S, jednu stránku ako výstupný buffer, a všetky ostatné stránky na uchovávanie „blokov“ vonkajšej relácie R. Cena : (prezeranie vonkajšej relácie)+(počet vonkajších blokov)*(prezeranie vnútornej relácie) 6

Sort-Merge Join V prvom kroku zotriedi relácie R a S na základe joinstĺpca. Potom ich prezerá za účelom ich zlúčenia (merge) a na výstup dáva výsledné záznamy. Cena : M log M + N log N + (M+N) Vylepšenie : skombinovanie zlučovaciej (merging) fázy triedenia R a S so zlučovaním potrebným pre join 7

Hash Join FÁZA 1 : Pomocou hash-ovaciej funkcie „h“ sa rozdelia obidve relácie do bucketov. R záznamy v partícii (buckete) i budú zodpovedať len S záznamom v i partícii. Pomocou hash-ovaciej funkcie „h“ sa rozdelia obidve relácie do tých istých bucketov. FÁZA 2 : Načítanie partície z relácie R, rozhasovanie hashovacou funkciou „h 2“. Prehľadávanie zodpovedajúcej S partície a generovanie výsledku. Zodpovedajúce záznamy sú v tých istých bucketoch – postupné načítavanie bucketov a generovanie výstupu join-u. Cena : V prvej fáze : read + write obidvoch relácií : 2(M+N) V druhej fáze : read obidvoch relácií : M+N I/O operácií 8

Porovnanie Join-ov • Sort-Merge Join – výsledok je zotriedený, menšia citlivosť na nesymetrickosť (? ) dát • Sort-Merge Join – dobré asymptotické správanie (ak veľkosť relácie vzrastá) • Hash Join – zdá sa byť najlepšou interpretáciou join-u • Simple Nested Loops Join – najneefektívnejšia interpretácia, možno použiť na malé relácie • V niektorých prípadoch môže byť najlepším Block Nested Loops Join (závisí na relačných parametroch) • Môžu závisieť od indexov 9

Poznámky k Join-om Rovnosť viacerých atribútov (napr. R. sid=S. sid AND R. rname=S. sname) Index NL – vytvorenie indexu na <sid, sname> (ak S je vnútornou reláciou) Sort-Merge, Hash Join – triedenie/delenie na základe kombinácie dvoch join-stĺpcov Podmienky nerovnosti (napr. R. name < S. sname) Index NL – potrebný (klusterovaný !) B+ strom index Sort-Merge, Hash Join – niesú použiteľné Block NL – zdá sa byť najlepšou metódou v tomto prípade 10

Implementácia Selekcie Existuje mnoho spôsobov ako implementovať túto operáciu, niektoré spôsoby závisia od existencie prístupových ciest (napr. index files) a môžu byť použité len na niektoré typy podmienok selekcie. Zopár príkladov na implementáciu selekcie : • Linear search • Binary search • Primary index/hash key to retrieve single records • Primary index to retrieve multiple records • Clustering index to retrieve multiple records • Secondary index • Conjunctive condition • Disjunctive condition 11

Jednoduchá selekcia • neexistuje index, relácia je nezotriedená • musí sa prezrieť každý záznam v relácii • cena : M (počet stránok v R) • existuje index na atribúte, podľa ktorého sa selekcia vykonáva • využitie indexu na nájdenie záznamov a následné obdržanie záznamov • hash-index sa môže použiť len na selekcie s podmienkou rovnosti • cena : závisí od počtu zodpovedajúcich záznamov a clustering-u = cena nájdenia zodpovedajúcich záznamov + cena obdržania záznamov 12

Selekcia so všeobecnou podmienkou Najprv by sa mali vykonať tie zložky podmienky, ktoré sa týkajú stĺpca, ku ktorému existuje index a až potom zvyšné. Príklad: SELECT * FROM Employee WHERE (DNO=5) AND (SEX=‘F’) DNO má sekundárny index Alternatíva 1: najprv vyberieme záznamy zodpovedajúce podmienke DNO=5 a z nich potom záznamy zodpovedajúce podmienke SEX=‘F’ Alternatíva 2: každý záznam zodpovedajúci podmienke DNO=5 bezprostredne po vybratí testujeme, či zodpovedá aj druhej podmienke Pre disjunktívne podmienky neexistuje žiadne jednoduché riešenie. Príklad disjunktívnej podmienky : SELECT * FROM Employee WHERE (DNO=5) OR (SEX=‘F’) Najlepšou cestou na vykonanie takejto zloženej podmienky je otestovať obidve (alebo viacero) podmienok nad každým záznamom naraz v jednom prechode. Tým predíme viacnasobmému spracovaniu záznamov. Nasledujúce dva prístupy k riešeniu selekcie so všeobecnou podmienkou sú založené na tom, že všetky všeobecné podmienky sa transformujú do normálnej konjuktívnej formy (konjinkcia elementárnych disjunkcií). Príklad: podmienka : (day<8/9/94 AND rname=Paul) OR bid=5 OR sid=3 sa konvertuje do tvaru : (day<8/9/94 OR bid=5 OR sid=3 ) AND (rname=Paul OR bid=5 OR sid=3 ) 13

Selekcia so všeobecnou podmienkou (prvý prístup) 1. 2. 3. nájdenie „most selective acces path“ na základe kroku 1. obdržanie záznamov aplikovanie zvyšných podmienok selekcie, ktoré nezodpovedajú indexu Poznámky : • „most selective acces path“ – index alebo prehľadanie súboru, ktoré podľa odhadu vyžaduje najmenej I/O operácií • súčasti podmienky, ktoré zodpovedajú indexu redukujú počet obdržaných záznamov • ostatné súčasti podmienky sa použijú na odstránenie niektorých obdržaných záznamov (neovplyvnia však počet záznamov, ktoré musíme spracovať) Príklad : day<8/9/94 AND bid=5 AND sid=3 • • použijeme B+ tree index nad stĺpcom day, potom bid=5 a sid=3 musí byť overené pre každý obdržaný záznam použijeme hash index nad <bid, sid>, potom pre každý obdržaný záznam musí byť preverené day<8/9/94 14

Selekcia so všeobecnou podmienkou (druhý prístup) 1. 2. 3. vytvorenie množín záznamov na základe jednotlivých indexov aplikovanie relačnej operácie PRIENIK (INTERSECTION) na tieto množiny záznamov obdržanie záznamov a aplikovanie zvyšných podmienok Poznámky : • používa sa ak máme 2 alebo viaceré (pre danú podmienku selekcie) použiteľné indexy • nazýva sa : intersection of rids Príklad : day<8/9/94 AND bid=5 AND sid=3 • máme B+ tree index nad stĺpcom day, nejaký index nad stĺpcom sid – pomocou prvého indexu obdržíme množinu záznamov zodpovedajúcich podmienke day<8/9/94, pomocou druhého množinu záznamov zodpovedajúcich podmienke sid=5, vykonáme ich prienik, obdržíme záznamy a nad nimi ešte preveríme podmienku bid=5 15

Implementácia projekcie • v súvislosti s implementáciou projekcie je jedinou netriviálnou záležitosťou odstránenie duplicitných záznamov • 2 možnosti (varianty) : 1. získanie záznamov, zotriedenie zoznamu a odstránenie duplikácii 2. usporiadanie záznamov a odstránenie duplikácii už počas vytvárania zoznamu (on the fly) • zotriedenie zoznamov vyžadujú obidve varianty kvôli efektívnosti • prístup založený na triedení : • modifikácia prechodu 0 na elimináciu nechcených polí (stĺpcov) počet prechodov sa nezmení, ale pracuje sa s menšími záznamami (závisí od počtu a veľkosti nechcených polí) • modifikácia zlučovaciej (merge) fázy na odstránenie duplikácií počet výsledných záznamov je menší ako vstup (rozdiel závisí od počtu duplikácií) 16

Projekcia založená na hashing-u Rozdeľovacia (partitioning) fáza • načítava sa relácie R použitím jedného vstupného buffer-a • pre každý záznam sa odstránia nechcené polia • na každý záznam sa aplikuje hash-ovacia funkcia h 1 (záznamy sa rozdelia do B-1 výstupných buffer-ov) • výsledok B-1 partícii záznamov bez nechcených polí • garancia, že dva záznamy z dvoch rôznych partícií sú odlišné Fáza odstránenia duplikátov • každá partícia sa načíta a v pamäti sa pre ňu vytvorí hash-ovacia tabuľka aplikovaním hash-ovaciej funkcie h 2 na všetky polia v zázname, čím sa eliminujú duplikáty 17

Implementácia projekcie -príklady Nested loop projection Hashing projection Sort-Merge projection 18

Implementácia množinových operácií (1) Tieto operácie sú niekedy drahé na implementovanie napr. product : Výsledok operácie obsahuje záznam pre každú kombináciu záznamu z tabuľky R(m záznamov, j atribútov) a S (n záznamov a k atribútov), čo môže byť značne veľká množina záznamov (n*m). Naviac výsledok obsahuje všetky atribúty z R a S(j+k) ). Preto je výhodnejšie vyvarovať sa použitiu operácie product a počas optimalizácie požiadavky ju nahradiť ekvivalentnými operáciami. Ostatné množinové operácie môžu byť použité len na union-kompatibilné relácie a s ohľadom na to sú implementované. Implementácia množinových operácií Implementácia množinových operácii zvyčajne pozostáva zo zotriedenia dvoch relácii na základe rovnakého atribútu. Po zotriedení je postačujúce jednoduché prezeranie oboch relácií na dosiahnutie výsledku. Zjednodušenie týchto operácii sa môže dosiahnuť triedením na základe jedinečného atribútu. 19

Implementácia množinových operácií (2) napr. : R union S môžme implementovať tak, že prechádzame oboma uloženými reláciami súbežne a keď narazíme na rovnaké záznamy v oboch reláciách, do výsledku zahrnieme len jednu. Na implementovanie týchto operácii môže byť taktiež použity hashing , a to tak, že obidva súbory sa hash-uju do rovnakých bucketov. napr. R union S môžeme implementovať tak, že najprv vykonáme hash záznamov z R a potom hash záznamov z S do toho istého hash súboru, pričom rovnaké záznamy nevkladáme. poznámky : • intersection (prienik) a product (karteziánsky súčin) – špeciálne prípady join-u • existuje mnoho modifikácií implementácií založených na triedení a hash-ovaní 20

Implementácia kombinácii operácií Požiadavka špecifikovaná pomocou relačnej algebry = sekvencia relačných operácii Ak vykonávame vždy len jednu operáciu v danom okamihu, môžme generovať toľko dočasných súborov, koľko je operácii . Tieto dočasné súbory budú použité nasledujúcimi operáciami. Generovanie a ukladanie veľkých dočasných súborov na disk je časovo a priestorovo náročné. Obmedzenie počtu dočasných súborov sa obyčajne rieši tak, že v SRBD sú implementované procedúry na vykonávanie najčastejšie použivaných kombinácii operácii. napr. Lepšie ako implementovať JOIN samostatne je implementovať ho spolu s dvoma operáciami SELECT na vstupných súboroch a operáciou PROJECT na výstupnom súbore záznamov – všetko to implementujeme pomocou jednej procedúry s dvoma vstupnými súbormi a jedným výstupným – túto procedúru môžme použiť priamo a dostaneme jeden výstupný súbor namiesto štyroch dočasných. 21

Implementácia agregačných operácii 1. bez zoskupenia (without group by) všeobecne vyžaduje prezeranie relácie a aplikovanie agregačnej funkcie na každý vyhovujúci záznam 2. so zoskupením (with group by) 1. 2. zotriedenie podľa group-by atribútu prezeranie relácie a počítanie agregačnej funkcie pre jednotlivé skupiny (modifikácia : triedenie a počítanie naraz) podobný prístup založený na hash-ovaní podľa group-by atribútov (hash-ovacia funkcia sa aplikuje na group-by atribúty – relácia bude rozdelená do partícii a v rámci nich sa vykonajú jednotlivé agregačné funkcie) 22

Zhrnutie vlastnosť relačných SRBD : Požiadavky sú kompozíciou niekoľkých základných operátorov. implementácia týchto operátorov by mala byť starostlivo vyladená (a je dôležité to vykonať) pre každý operátor existuje mnoho rozdielnych implementačných techník pre väčšinu operátorov neexistuje jediná najlepšia technika je potrebné zvážiť viaceré techniky implementácie pre každý operátor v požiadavke a vybrať najvhodnejšiu na základe napr. štatistík, fyzickej organizácie a pod. – otázka optimalizácie zložených požiadaviek KONIEC 23
- Slides: 23