Rendezésen alapuló kétmenetes algoritmusok Wypior Joel teszt
Alapok Az operandus reláció adatait először beolvassuk a memóriába, ott valamilyen módon feldolgozzuk azokat, majd lemezre írjuk. A művelet befejezéséhez ismét beolvassuk a memóriába. Általában két menet elegendő, nagy relációk esetében is, de nem okoz nehézséget több menetre történő általánosítás sem. Reláció: pl. bemeneti lista.
1. Fázis Tegyük fel, hogy van egy nagy relációnk (R), amelyre B(R) nagyobb M-nél, tehát az R reláció nagyobb a rendelkezésre álló memóriapufferek méreténél. Ezért a blokkokat külön-külön be kell tölteni a memóriába és futtatni rajtuk az algoritmusokat, és utána külön-külön kiírjuk a blokkokat a lemezre. Ebből lesznek a rendezett részlisták.
. . . . . . 1. Lépés Beolvassuk R-nek M darab blokkját a memóriába. rendezett részlisták R . . . . . . Lemez Lemez M memóriapufferek
M darab blokkon lefutó algoritmus 2. Lépés A memóriába töltött M darab blokkot rendezzük valamilyen hatékony algoritmussal. Valószínűleg ez a lépés nem fog tovább tartani mint az előző olvasási művelet. M darab blokkon lefutó algoritmus rendezett részlisták R . . . . . . Lemez Lemez M memóriapufferek
. . . . . . 3. Lépés A rendezett listát kiírjuk M darab lemezblokkba. A blokkok tartalmára R rendezett részlistáinak egyikeként fogunk hivatkozni. M darab blokk rendezett részlisták R . . . . . . Lemez Lemez M memóriapufferek
Ismétlődések kiküszöbölése rendezés segítségével – δ(R) Vesszük az egyes blokkok első, még nem vizsgált sorát, és megkeressük közöttük a rendezés szerinti elsőt. (t) Ezt a sort egyszer kimásoljuk a kimenetbe. Az összes blokk elejéről eltávolítjuk t összes példányát. (delta)
Ismétlődések kiküszöbölése rendezés segítségével Ha egy blokk kiürül, akkor pufferébe behozzuk ugyanazon részlista következő blokkját. Ha abban a blokkban is szerepel t, akkor azt is eltávolítjuk. Bemenet 1 M-1 darab részlista . . . Bemenet 2 Kimenet . . . . Bemenet M-1 Lemez Lemez M darab blokk memória
Ismétlődések kiküszöbölése rendezés segítségével Az algoritmus által végrehajtott lemez I/O-műveletek száma, nem beleszámítva a kimenet kezelését: β(R) R minden egyes blokkjának beolvasásához, a rendezett részlisták létrehozásakor. β(R) az egyes rendezett részlisták lemezre írásához. β(R) a részlisták minden egyes blokkjának megfelelő időben való beolvasáshoz. Az egymenetes algoritmusnak csak β(R) az összköltsége.
Ismétlődések kiküszöbölése rendezés segítségével Összköltsége: 3β(R). Alkalmazási feltétele: B≤M2 Szükséges blokkok: 𝑩 Ezzel szemben az egymenetes algoritmusnak az alkalmazási feltétele: B≤M Felteve, hogy M memoriablokk van, egyenkent eppen M darab blokkbol allo reszlistakra hozunk letre. A masodik menetben aztan minden egyes reszlistanak egy memoriablokkra van szüksege, így M-nél nem lehet tobb reszlista, es ezek mindegyike M blokk hosszusagu.
Csoportosítás és összesítés rendezés segítségével – γL(R) Hasonló az egymenetes γ(R) algoritmushoz. R sorait M blokkonként beolvassuk a memóriába. Minden M darab blokkot rendezünk, rendezési kulcsként az L csoportosító attribútumait használva. Az egyes rendezett részlistákat egyenként lemezre írjuk. Minden egyes részlistához egy darab memóriablokkot használva, első lépésként az egyes részlisták első blokkját betöltjük a hozzá tartozó pufferbe. Egymás utáni ismétlődően mindig újra megkeressük a rendezeti kulcs (a csoportosító attribútumok) szerinti legkisebb értékét a pufferek sorra követő sorai között. (Gamma)
Csoportosítás és összesítés rendezés segítségével Ez a v érték alkotja a következő csoportot, amelyre a következőket tesszük: Előkészítjük a csoport L listában szereplő összesítéseinek a kiszámítását. A v keresési kulccsal összehasonlítva megvizsgáljuk a sorok mindegyikét, és folyamatosan gyűjtjük a szükséges összesítéseket. Ha egy puffer kiürül, akkor beolvassuk a helyére ugyanannak a részlistának a következő blokkját
Csoportosítás és összesítés rendezés segítségével Ha nincs több sor, amelyik a v keresési kulccsal rendelkezik, akkor kiírunk egy olyan sort a kimenetbe, amelyik az L csoportosító attribútumaiból, valamint a csoportra hozzájuk kiszámított összesítések értékeiből áll. Lemez I/O-költség: 3β(R) Alkalmazási feltétel: B≤M2 Szükséges blokkok: 𝑩
Egyesítés rendezés segítségével - RυsS Multihalmaz-egyesítésnél az egymenetes algoritmus az argumentumok méretétől függetlenül működik, nincs szükség kétmenetes algoritmusra. RυsS kiszámítása: R sorait M darab blokkonként beolvassuk a memóriába, a sorokat rendezzük, majd a kapott rendezett részlistákat visszaírjuk a lemezre. M darab blokk beolvasása, sorok rendezése rendezett részlisták R . . . . . . Lemez Lemez memóriapufferek
Egyesítés rendezés segítségével Ugyanezt elvégezzük S-re at S reláció rendezett részlisták létrehozásához. R és S minden egyes részlistájához veszünk egy memóriapuffert, majd a megfelelő részlista első blokkját oda betöltjük. M darab blokk beolvasása, sorok rendezése rendezett részlisták S . . . . . . Lemez Lemez memóriapufferek
Egyesítés rendezés segítségével Újra és újra megkeressük a pufferekbe az első még ott lévő t sort. Bemásoljuk a t-t a kimenetbe, majd t összes előfordulását eltávolítjuk a pufferből. (Ha R és S halmazok, akkor legfeljebb két ilyen előfordulás lehet). Ha egy puffer kiürül, akkor azt feltöltjük a megfelelő részlista következő blokkjával. I/O-költség: 3(B(R)+B(S)) Alkalmazási feltétel: B(R)+B(S)≤M2
Metszet és Különbség rendezés segítségével Létrehozzuk az R argumentum relációra az M blokkból álló rendezett részlistákat. M darab blokk beolvasása, sorok rendezése rendezett részlisták . . . . . . R Lemez Lemez memóriapufferek
Metszet és Különbség rendezés segítségével Létrehozzuk az S argumentum relációra az M blokkból álló rendezett részlistákat. M darab blokk beolvasása, sorok rendezése rendezett részlisták . . . . . . S Lemez Lemez memóriapufferek
Metszet és Különbség rendezés segítségével Ezután minden részlistához egy memóriapuffert használunk, amelyet kezdetben a részlista első blokkjával töltünk fel. Azután újra és újra megvizsgáljuk az összes pufferben maradó sor közül a legkisebb t- sort. Meghatározzuk R összes t-vel azonos sorának számát, majd ugyanezt megtesszük S-re is. Ehhez ismét az szükséges, hogy a puffereket újra feltöltsük arról a részlistáról, amelynek aktuálisan pufferelt blokkja kiürült. 1. Részlista első blokkja R és S rendezett részlisták . . . 2. Részlista első blokkja Metszet / Különbség . . . . Utolsó részlista első blokkja Lemez Lemez memóriapufferek
Metszet és Különbség rendezés segítségével Ha a művelet a halmazmetszet, úgy t-t akkor írjuk ki, ha R-ben és S- ben is előfordul. Ha a művelet a multihalmazmetszet, úgy t-t annyiszor tesszük a kimenetbe, amennyi az R-beli és S-beli előfordulásainak a minimuma. Ha ezen számosságok bármelyike nulla, azaz, ha t nem szerepel mindkét relációban, akkor t-t nem írjuk a kimenetbe. Ha a művelet a halmazkülönbség, R-sS , akkor t-t csak akkor tesszük a kimenetbe, ha R-ben előfordul, de S-ben nem. Ha a művelet multihalmazkülönbség, R-BS, akkor t-t annyiszor írjuk a kimenetbe, ahányszor előfordul R-ben mínusz ahányszor előfordul S-ben. Ha t S-ben legalább annyiszor fordul elő, mint R-ben, akkor nem tesszük a kimenetbe.
Metszet és Különbség rendezés segítségével I/O-művelet: 3(B(R)+B(S)) Alkalmazási feltétel: (B(R)+B(S)≤M2 Szükséges blokk: 𝐵(𝑅+𝐵 𝑆 )
Egyszerű rendezésen alapuló összekapcsolási algoritmus Tegyük fel, hogy R(X, Y) és S(Y, Z) relációkat szeretnénk összekapcsolni és M memóriablokk áll rendelkezésre. Rendezzük R-et egy kétfázisú többutas összefésüléssel, amelyben Y a rendezési kulcs. S-et hasonló módon rendezzük. Összefésüljük a rendezett R és S relációkat. Ehhez általában csak két puffert használunk, egyet R és egyet S éppen aktuális blokkjára.
Egyszerű rendezésen alapuló összekapcsolási algoritmus Az alábbi lépéseket kell többször megismételnünk: Megkeressük az Y összekapcsolási attribútumoknak azt a legkisebb y értékét, amely éppen az R és S blokkok elején található. Ha y nem jelenik meg a másik reláció elején, akkor az y rendezési kulcsú sor(oka)t eltávolítjuk. R Részlista aktuális blokkja R és S rendezett részlisták . . . Algoritmus . . . . S Részlista aktuális blokkja Lemez Lemez memóriapufferek
Egyszerű rendezésen alapuló összekapcsolási algoritmus Egyébként azonosítjuk mindkét relációban az összes y rendezési kulcsú sort. Ha szükséges, addig olvassuk be a rendezett R és S blokkjait, amíg biztosak nem leszünk benne, hogy már egyik relációban sincs y értékű sor. Erre a célra összesen M puffert használhatunk fel. A kimenetbe írjuk az összes olyan sort, amely R és S közös Y értékkel - jelen esetben éppen y-nál - rendelkező sorainak összekapcsolásával kialakítható. Ha bármelyik relációban már nincs több megvizsgálatlan sor a memóriában, akkor annak pufferét újra feltöltjük.
Egyszerű rendezésen alapuló összekapcsolási algoritmus Ha van olyan y Y érték, amelyre az ezzel az értékkel rendelkező sorok nem férnek be a pufferbe, akkor az előző algoritmust módosítanunk kell. Ha az egyik reláció (R) y Y értékkel rendelkező sorai beférnek M-1 darab pufferbe, akkor olvassuk be R ezen blokkjait pufferekbe, majd egyenként olvassuk be S y értékű sorait a fennmaradó pufferbe. Valójában ilyenkor az egymenetes összekapcsolását végezzük el azokra, amelyre Y értéke éppen y. Ha mindkét relációnak több y Y értékű sora van, annál hogy azok M-1 pufferbe beférjenek, akkor használjuk fel az M puffert, és hajtsunk végre egy beágyazott ciklusú összekapcsolást a két reláció y Y értékű sorain.
Egyszerű rendezésen alapuló összekapcsolási algoritmus I/O-költség: 5(B(R)+B(S)) Korlát: B(R), B(S)≤M2 Szükséges blokk: 𝐦𝐚𝐱(𝑩 𝑹 ,𝑩 𝑺 ) Algoritmusunk az argumentum relációk minden blokkjára öt lemez I/O-műveletet végez. Kivételt képezne az az eset, ha olyan sok sor lenne azonos Y értékkel, hogy a szóban forgó sorokat valamilyen speciális módon kellene összekapcsolnunk. Ebben az esetben a további lemez I/O-műveletek száma attól függ, hogy csak az egyik avagy mindkét reláció olyan sok azonos Y értékű sorral rendelkezik-e, hogy azok maguk már M-1-nél több puffert igényelnek. Meg kell vizsgálnunk, hogy mekkorának kell M-nek lennie ahhoz, hogy az egyszerű rendezéses összekapcsolás működjön. Az elsődleges korlát az, hogy végre kell tudnunk hajtani R-en és S-en a kétfázisú, többutas összefésüléses rendezéseket. Ha ezzel készen vagyunk, akkor már nem fogunk kifogyni a pufferből, noha esetleg el kell majd térnünk az egyszerű összefésüléstől, ha az azonos Y értékkel rendelkező sorok nem férnek be M pufferbe.
Hatékonyabb rendezésen alapuló összekapcsolási algoritmus „összefésüléses összekapcsolás” „rendezéses összefésüléses összekapcsolás” Az R(X,Y) |><| S(Y,Z) összekapcsolást M darab memóriablokkot használva a következőképpen számíthatjuk ki: Ha nem kell aggódnunk az összekapcsolási attribútumokon azonos értékkel bíró sorok igen nagy száma miatt, akkor blokkonként 2 lemez I/O-műveletet megtakaríthatunk, azáltal, hogy a rendezések második fázisát kombináljuk magával az összekapcsolással. Az ilyen algoritmusokat egyszerűen rendezéses összekapcsolásnak hívjuk. További ismert elnevezések még az „összefésüléses összekapcsolás” és a „rendezéses összefésüléses összekapcsolás”.
Hatékonyabb rendezésen alapuló összekapcsolási algoritmus Y-t rendezési kulcsként használva mind R-re, mind S-re M méretű rendezett részlistákat hozunk létre. Az egyes részlisták első blokkjait behozzuk egy-egy pufferbe, ehhez feltesszük, hogy összesen nincs M-nél több részlista. A részlisták soron következő sorai között újra meg újra megkeressük a legkisebb Y értéket, y-t. Mindkét reláció sorai között beazonosítjuk az y értékkel rendelkezőket, ehhez esetleg betesszük azokat az M szabad puffer némelyikébe, feltéve, hogy M-nél kevesebb részlista van. A kimenetbe tesszük az összes olyan R-beli és S-beli sorok összekapcsolását, amelyek az Y attribútum(ok)on y értékkel rendelkeznek. Ha közben bármelyik részlista puffere kiürül, akkor azt lemezről ismét feltöltjük.
Hatékonyabb rendezésen alapuló összekapcsolási algoritmus I/O-költség: 3(B(R)+B(S)) Szükséges blokk: (𝑩 𝑹 +𝑩 𝑺 )
Összefoglalás Köszönöm a figyelmet! Operátor Szükséges blokkok kb. Lemez I/O műveletek γ, δ 𝐵 3B ∩, υ, - 𝐵(𝑅+𝐵 𝑆 ) 3(B(R)+B(S)) egyszerű összekapcsolás max(𝐵 𝑅 ,𝐵 𝑆 ) 5(B(R)+B(S)) hatékonyabb összekapcsolás (𝐵 𝑅 +𝐵 𝑆 ) Köszönöm a figyelmet!