Célok: gyors lekérdezés, gyors adatmódosítás, minél kisebb tárolási terület. s at a iku k s ( dinamikus blokkokat

Hasonló dokumentumok
Fájlszervezés. Adatbázisok tervezése, megvalósítása és menedzselése

Ellenőrző kérdések. 36. Ha t szintű indexet használunk, mennyi a keresési költség blokkműveletek számában mérve? (1 pont) log 2 (B(I (t) )) + t

1. Az Oracle adatbázis-kezelő felépítése, működése, komponensei, példányok, rendszerállományok, memóriakezelése, rendszergazdai feladatok

Adatbázisok 2. Készítette: Gerstweiler Anikó Éva- GEAQAAI.ELTE Molnár Dávid - MODQABI.ELTE

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

17. A 2-3 fák és B-fák. 2-3 fák

Alapvető fizikai tárolási szerkezetek, indexek, B-fák

Adatbáziskezelés alapjai. jegyzet

file:///d:/okt/ad/jegyzet/ad1/b+fa.html

Lekérdezések optimalizálása

A továbbiakban Y = {0, 1}, azaz minden szóhoz egy bináris sorozatot rendelünk

Algoritmuselmélet. 2-3 fák. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem. 8.

Marton József BME-TMIT. Adatbázisok VITMAB november 11.

Algoritmuselmélet 2. előadás

Adatszerkezetek 2. Dr. Iványi Péter

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Ellenőrző kérdések. 1. Kis dolgozat kérdései

Algoritmuselmélet. Hashelés. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem

Algoritmusok és adatszerkezetek I. 1. előadás

Algoritmuselmélet. Hashelés. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Algoritmusok és adatszerkezetek gyakorlat 07

Útmutató a MATARKA adatbázisból való adatátvételhez

Programozás I. zárthelyi dolgozat

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

10. előadás Speciális többágú fák

1. FELADAT Mez neve Mez típusa Mez hossza TermékID Tényleges eladás Hónap Mez neve Mez típusa

Algoritmuselmélet 6. előadás

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Adatbáziskezelés. Indexek, normalizálás NZS 1

Lekérdezések feldolgozása és optimalizálása

Algoritmusok és adatszerkezetek 2.

Bevezetés a programozásba. 5. Előadás: Tömbök

Adatszerkezetek Hasító táblák. Dr. Iványi Péter

Programozás alapjai II. (7. ea) C++

B-fa. Felépítés, alapvető műveletek. Programozás II. előadás. Szénási Sándor.

Relációs algebra áttekintés és egy táblára vonatkozó lekérdezések

Lekérdezések az SQL SELECT utasítással. Copyright 2004, Oracle. All rights reserved.

Adatbázis és szoftverfejlesztés elmélet. Programozási tételek

Adatszerkezetek I. 6. előadás

Operációsrendszerek. 3. elıadás. Állományszervezés, felhasználói felületek

Programozás I gyakorlat

Programozás alapjai 9. előadás. Wagner György Általános Informatikai Tanszék

Erıforrástérkép felhasználói kézikönyv 1.0

Felvételi tematika INFORMATIKA

Rendezések. Összehasonlító rendezések

A számítástudomány alapjai. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem

Összegzı mérleg. METRISoft MS-UMT-01 Mérlegmőszerrel. Kezelési Segédlet

Adatbázis-lekérdezés. Az SQL nyelv. Makány György

Struktúra nélküli adatszerkezetek

Relációs algebra lekérdezések optimalizációja. Adatbázisok használata

Mérlegjegy. Szécsy Számítástehnika 4080 Hajdúnánás, Ady krt

RELÁCIÓS LEKÉRDEZÉSEK OPTIMALIZÁLÁSA. Marton József november BME TMIT

Programozás alapjai. 10. előadás

Algoritmusok és adatszerkezetek I. 5. előadás

file:///d:/apa/okt/ad/jegyzet/ad1/b+fa.html

2MU09f_Konkvez_feladatok.pdf Feladatok a tranzakciókezelésbıl

Az SQL adatbázisnyelv: DML

Java II. I A Java programozási nyelv alapelemei

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

Nyíregyházi Egyetem Matematika és Informatika Intézete. Fájl rendszer

Gyakori elemhalmazok kinyerése

Gazdasági folyamatok térbeli elemzése. 5. elıadás

7 7, ,22 13,22 13, ,28

Egyirányban láncolt lista

MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1

Nézetek és indexek. AB1_06C_Nézetek_Indexek - Adatbázisok-1 EA (Hajas Csilla, ELTE IK) - J.D. Ullman elıadásai alapján

Adatbáziskezelı-szerver SQL. Relációs adatbázis-kezelık. Relációs adatszerkezet. Házi feladat

Méretlánc átrendezés a gyakorlatban (Készítette: Andó Mátyás, a számonkérés az elıadás és a gyakorlat anyagára is kiterjed.)

Adatszerkezetek I. 8. előadás. (Horváth Gyula anyagai felhasználásával)

Táblázatok fontosabb műveletei 1

Ugrólisták. RSL Insert Example. insert(22) with 3 flips. Runtime?

Budapesti Műszaki és Gazdaságtudományi Egyetem Automatizálási és Alkalmazott Informatikai Tanszék INFORMATIKA 2 ADATBÁZISOK

Haladó rendezések. PPT 2007/2008 tavasz.

Operációs rendszerek. UNIX fájlrendszer

Adatbázisok elmélete

adatszerkezetek 2007/7/6 15:51 page 27 #23

Adatbázisok biztonsága

INDEXSTRUKTÚRÁK III.

R ++ -tree: an efficient spatial access method for highly redundant point data - Martin Šumák, Peter Gurský

Adatbázisok elmélete 18. előadás

19. Hasításos technikák (hash-elés)

Adatszerkezetek 7a. Dr. IványiPéter

HIDASNÉMETI KÖZSÉG ÖNKORMÁNYZATA POLGÁRMESTERI HIVATALÁNAK SZERVEZETFEJLESZTÉSE E-KÖZIGAZGATÁSI ALAPISMERETEK

Algoritmusok bonyolultsága

9. előadás. A táblázat. A táblázatról általában, soros, önátrendező, rendezett és kulcstranszformációs táblázat

Informatika szigorlat 9-es tétel: Az adatbázis-kezelő rendszerek fogalmai

2. Visszalépéses keresés

Adatbázis, adatbázis-kezelő

Adatszerkezetek 1. Dr. Iványi Péter

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Az indexelés újdonságai Oracle Database 12c R1 és 12c R2

Átlag( ; ): a paraméterlistában megadott számok átlagát adja meg eredményül. Pl.: Átlag(a2:a8)

LBRA6i integrált rendszer

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

Microsoft Excel. Táblázatkezelés. Dr. Dienes Beatrix

Átírás:

Célok: gyors lekérdezés, gyors adatmódosítás, minél kisebb tárolási terület. Nincs általánosan legjobb optimalizáció. Az egyik cél a másik rovására javítható (például indexek használatával csökken a keresési idı, nı a tárméret, és nı a módosítási idı). Az adatbázis-alkalmazások alapján az adatbázis lehet: statikus (ritkán módosul, a lekérdezések gyorsasága a fontosabb), dinamikus (gyakran módosul, ritkán végzünk lekérdezést). Hogyan mérjük a költségeket? Memória mőveletek nagyságrenddel gyorsabbak, mint a háttértárolóról beolvasás, kiírás. Az író-olvasó fej nagyobb adategységeket (blokkokat) olvas be. A blokkméret függhet az operációs rendszertıl, hardvertıl, adatbáziskezelıtıl. A blokkméretet fixnek tekintjük. Oracle esetén 8K az alapértelmezés. Feltételezzük, hogy a beolvasás, kiírás költsége arányos a háttértároló és memória között mozgatott blokkok számával. 1

Célszerő a fájlokat blokkokba szervezni. A fájl rekordokból áll. A rekordok szerkezete eltérı is lehet. A rekord tartalmaz: leíró fejlécet (rekordstruktúra leírása, belsı/külsı mutatók, (hol kezdıdik egy mezı, melyek a kitöltetlen mezık, melyik a következı rekord, melyik az elızı rekord), törlési bit, statisztikák), mezıket, melyek üresek, vagy adatot tartalmaznak. A rekordhossz lehet: állandó, változó (változó hosszú mezık, ismétlıdı mezık miatt). Az egyszerőség kedvéért feltesszük, hogy állandó hosszú rekordokból áll a fájl, melyek hossza az átlagos rekordméretnek felel. A blokkok tartalmaznak: leíró fejlécet (rekordok száma, struktúrája, fájlok leírása, belsı/külsı mutatók (hol kezdıdik a rekord, hol vannak üres helyek, melyik a következı blokk, melyik az elızı blokk, statisztikák (melyik fájlból hány rekord szerepel a blokkban)), rekordokat (egy vagy több fájlból), üres helyeket. 2

A költségek méréséhez paramétereket vezetünk be: l - (length) rekordméret (bájtokban) b - blokkméret (bájtokban) T - (tuple) rekordok száma B - a fájl mérete blokkokban bf blokkolási faktor (mennyi rekord fér el egy blokkban: bf = b/l - alsó egészrész) B= T/bf M memória mérete blokkokban Például R S mérete mekkora: l(r S) = l(r)+l(s) T(R S) = T(R)*T(S) bf(r S) = b / (l(r)+l(s)) B(R S) = (T(R)*T(S)) * (l(r)+l(s)) / b = (T(S)*T(R)*l(R)/b) + (T(R)*T(S)*l(S)/b)= =T(S)*B(R) + T(R)*B(S) 3

Milyen lekérdezéseket vizsgáljunk? A relációs algebrai kiválasztás felbontható atomi kiválasztásokra, így elég ezek költségét vizsgálni. A legegyszerőbb kiválasztás: A=a (A egy keresési mezı, a egy konstans) Kétféle bonyolultságot szokás vizsgálni: átlagos, legrosszabb eset. Az esetek vizsgálatánál az is számít, hogy az A=a feltételnek megfelelı rekordokból lehet-e több, vagy biztos, hogy csak egy lehet. Fel szoktuk tenni, hogy az A=a feltételnek eleget tevı rekordokból nagyjából egyforma számú rekord szerepel. (Ez az egyenletességi feltétel.) 4

Az A oszlopban szereplı különbözı értékek számát képméretnek hívjuk és I(A)-val jelöljük. I(A)= Π A (R) Egyenletességi feltétel esetén: T(σ A=a (R)) = T(R) / I(A) B(σ A=a (R)) = B(R) / I(A) A következı fájlszervezési módszereket fogjuk megvizsgálni: kupac (heap) rendezett állomány elsıdleges index (ritka index) másodlagos index (sőrő index) többszintő index B + -fa, B*-fa hasító index (hash) Azt az esetet vizsgáljuk, mikor az A=a feltételő rekordok közül elég az elsıt megkeresni. Módosítási mőveletek: beszúrás (insert) frissítés (update) törlés (delete) Az egyszerősített esetben nem foglalkozunk azzal, hogy a beolvasott rekordokat bent lehet tartani a memóriában, késıbbi keresések céljára. 5

Kupac szervezés: a rekordokat a blokk elsı üres helyre tesszük a beérkezés sorrendjében. Tárméret: B A=a keresési idı: B (a legrosszabb esetben), B/2 (átlagos esetben egyenletességi feltétel esetén). Beszúrás: utolsó blokkba tesszük a rekordot, 1 olvasás + 1 írás módosítás: 1 keresés + 1 írás törlés: 1 keresés + 1 írás (üres hely marad, vagy a törlési bitet állítják át) 6

Indexek használata: keresést gyorsító segédstruktúra több mezıre is lehet indexet készíteni az index tárolása növeli a tárméretet nem csak a fıfájlt, hanem az indexet is karban kell tartani, ami plusz költséget jelent ha a keresési mezı egyik indexmezıvel sem esik egybe, akkor kupac szervezést jelent Az indexrekordok szerkezete: (a,p), ahol a egy érték az indexelt oszlopban, p egy blokkmutató, arra a blokkra mutat, amelyben az A=a értékő rekordot tároljuk. az index mindig rendezett az indexértékek szerint Oracle SQL-ben: egyszerő index: CREATE INDEX supplier_idx ON supplier (supplier_name); összetett index: CREATE INDEX supplier_idx ON supplier (supplier_name, city) COMPUTE STATISTICS; -- az optimalizáláshoz szükséges statisztikák elkészítésével -- 7

Elsıdleges index: fıfájl is rendezett csak 1 elsıdleges indexet lehet megadni (mert csak egyik mezı szerint lehet rendezett a fıfájl. elég a fıfájl minden blokkjának legkisebb rekordjához készíteni indexrekordot indexrekordok száma: T(I)=B (ritka index) indexrekordból sokkal több fér egy blokkba, mint a fıfájl rekordjaiból: bf(i)>>bf, azaz az indexfájl sokkal kisebb rendezett fájl, mint a fıfájl: B(I) = B / bf(i) << B=T / bf Keresési idı: az indexfájlban nem szerepel minden érték, ezért csak fedı értéket kereshetünk, a legnagyobb olyan indexértéket, amely a keresett értéknél kisebb vagy egyenlı fedı érték keresése az index rendezettsége miatt bináris kereséssel történik: log 2 (B(I)) a fedı indexrekordban szereplı blokkmutatónak megfelelı blokkot még be kell olvasni 1+log 2 (B(I)) << log 2 (B) (rendezett eset) Módosítás: rendezett fájlba kell beszúrni ha az elsı rekord változik a blokkban, akkor az indexfájlba is be kell szúrni, ami szintén rendezett megoldás: üres helyeket hagyunk a fıfájl, és az indexfájl blokkjaiban is. Ezzel a tárméret duplázódhat, de a beszúrás legfeljebb egy fırekord és egy indexrekord visszaírását jelenti. 8

Elsıdleges index Az adatfájl rendezett, ezért elég a blokkok elsı rekordjaihoz indexrekordokat tárolni. Ritka index 50 70 90 1 1 150 170 190 2 2 Adatállomány 50 60 70 80 90 0 9

Beszúrás ritka index esetén: Vigyük be a 34-es rekordot! 60 34 Szerencsére volt üres hely! 50 60

Beszúrás ritka index esetén: Vigyük be a 15-ös rekordot! 60 60 Azonnal újrarendeztük az állományt. Másik változatban: túlcsordulási blokkot láncolunk a blokkhoz 50 60 15 11

Beszúrás ritka index esetén: Vigyük be a 25-ös rekordot! 60 50 60 25 Túlcsordulási blokkot nyitunk, és késıbbre halasztjuk az újrarendezést. 12

Törlés ritka indexbıl: Töröljük a -es rekordot! 50 70 90 1 1 150 50 60 70 80 13

Törlés ritka indexbıl: Töröljük a -as rekordot! 50 70 90 1 1 150 50 60 70 80 14

Törlés ritka indexbıl: Töröljük a -as és -es rekordot! 50 70 50 70 90 1 1 150 50 60 70 80 15

Másodlagos index: fıfájl rendezetlen (az indexfájl mindig rendezett) több másodlagos indexet is meg lehet adni a fıfájl minden rekordjához kell készíteni indexrekordot indexrekordok száma: T(I)=T (sőrő index) indexrekordból sokkal több fér egy blokkba, mint a fıfájl rekordjaiból: bf(i)>>bf, azaz az indexfájl sokkal kisebb rendezett fájl, mint a fıfájl: B(I) = T/bf(I) << B=T/bf Keresési idı: az indexben keresés az index rendezettsége miatt bináris kereséssel történik: log 2 (B(I)) 2 a talált indexrekordban szereplı blokkmutatónak megfelelı blokkot még be kell olvasni 1+log 2 (B(I)) << log 2 (B) (rendezett eset) az elsıdleges indexnél rosszabb a keresési idı, mert több az indexrekord Módosítás: a fıfájl kupac szervezéső rendezett fájlba kell beszúrni ha az elsı rekord változik a blokkban, akkor az indexfájlba is be kell szúrni, ami szintén rendezett megoldás: üres helyeket hagyunk a fıfájl, és az indexfájl blokkjaiban is. Ezzel a tárméret duplázódhat, de a beszúrás legfeljebb egy fırekord és egy indexrekord visszaírását jelenti. 16

Másodlagos index Minden rekordhoz tartozik indexrekord. Sőrő index 50 60 70 80 90 0 1 1 Adatállomány 50 60 70 80 90 0 17

Törlés sőrő indexbıl: Töröljük a -as rekordot! 50 60 70 80 50 60 70 80 18

Mi történik, ha egy érték többször is elıfordulhat? Több megoldás is lehetséges. Elıször tegyük fel, hogy rendezett az állomány. 1. megoldás: Sőrő index Minden rekordhoz tárolunk egy indexrekordot. 45 19

Vigyázat! Ritka index nem jó. A fedıértéknek megfelelı blokk elıtti és utáni blokkokban is lehetnek találatok. Például, ha a -ast vagy a -ast keressük. 45!!

2. megoldás: Ritka index Rendezett állomány Rendezett állomány esetén csak az elsı elıforduláshoz tárolunk egy indexrekordot. 45 21

Rendezett állomány esetén nem az elsı rekordhoz, hanem az értékhez tartozó elsı elıforduláshoz készítünk indexrekordot. Az adatállomány blokkjait láncoljuk. 45 22

Ha nem rendezett az állomány, akkor nagy lehet a tárolási és keresési költség is:... 23

Egy lehetséges megoldás, hogy az indexrekordok szerkezetét módosítjuk: (indexérték, mutatóhalmaz) Probléma: változó hosszú indexrekordok keletkeznek 24

Összeláncolhatjuk az egyforma értékő rekordokat. Probléma: 50 60... - a rekordokhoz egy új, mutató típusú mezıt kell adnunk - követni kell a láncot λ λ λ λ 25

50 60... A mutatókat külön blokkokban is tárolhatjuk, így nem kell változó hosszú indexrekordokat kezelni. Kosarak ELİNY: több index esetén a logikai feltételek halmazmőveletekkel kiszámolhatók. 26

select * from dolgozó where osztály='büfé' and emelet=2; osztály_index dolgozó emelet_index büfé 2 A büféhez és a 2-höz tartozó kosarak metszetét kell képezni, hogy megkapjuk a keresett mutatókat. 27

Klaszter (nyaláb, fürt) Klaszterszervezés egy tábla esetén egy A oszlopra: az azonos A-értékő sorok fizikailag egymás után blokkokban helyezkednek el. CÉL: az elsı találat után az összes találatot megkapjuk soros beolvasással. Klaszterindex: klaszterszervezéső fájl esetén index az A oszlopra Klaszterszervezés két tábla esetén az összes közös oszlopra: a közös oszlopokon egyezı sorok egy blokkban, vagy fizikailag egymás utáni blokkokban helyezkednek el. CÉL: összekapcsolás esetén az összetartozó sorokat soros beolvasással megkaphatjuk. 28

Ha nagy az index, akkor az indexet is indexelhetjük. 90 170 250 3 4 490 570 Ritka index (2. szint) 50 70 90 1 1 150 170 190 2 2 Adatállomány 50 60 70 80 90 0 Ritka (vagy sőrő) index 1. szint 29

Többszintő index: az indexfájl (1. indexszint) is fájl, ráadásul rendezett, így ezt is meg lehet indexelni, elsıdleges indexszel. a fıfájl lehet rendezett vagy rendezetlen (az indexfájl mindig rendezett) t-szintő index: az indexszinteket is indexeljük, összesen t szintig Keresési idı: a t-ik szinten (I (t) ) bináris kereséssel keressük meg a fedı indexrekordot követjük a mutatót, minden szinten, és végül a fıfájlban: log 2 (B(I (t) ))+t blokkolvasás ha a legfelsı szint 1 blokkból áll, akkor t+1 blokkolvasást jelent. (t=?) minden szint blokkolási faktora megegyezik, mert egyforma hosszúak az indexrekordok.

blokkok száma rekordok száma FİFÁJL 1. szint 2. szint... t. szint B B/bf(I) B/bf(I) 2... B/bf(I) t T B B/bf(I)... B/bf(I) (t-1) blokkolási bf bf(i) bf(i)... bf(i) faktor t-ik szinten 1 blokk: 1=B/bf(I) t azaz t=log bf(i) B < log 2 (B) azaz jobb a rendezett fájlszervezésnél. log bf(i) B < log 2 (B(I)) is teljesül általában, így az egyszintő indexeknél is gyorsabb 31

A többszintő indexek közül a B + -fák, B*-fák a legelterjedtebbek. B + -fa: Minden blokk legalább 50%-ban telített. B*-fa: Minden blokk legalább 66%-ban telített. Gyökér 0 B + -fa: a szerkezeten kívül a telítettséget biztosító karbantartó algoritmusokat is beleértjük 3 5 11 35 0 1 1 1 1 150 156 179 180 0 12 15 50 18 80 32

Köztes (nem-levél) csúcs szerkezete 57 81 95 n+1 mutató n indexérték k < 57 57 k<81 81 k<95 95 k Ahol k a mutató által meghatározott részben (részgráfban) szereplı tetszıleges indexérték 33

Levél csúcs szerkezete köztes csúcs a sorrendben következı levél 34 57 indexértékő rekord 81 indexértékő rekord 95 indexértékő rekord 57 81 95 n+1 mutató n indexérték

Szúrjuk be a 32-es indexértékő rekordot! n=3 3 5 11 0 31 32 35

Szúrjuk be a 7-es indexértékő rekordot! n=3 3 5 3 5 11 0 7 31 7 36

Szúrjuk be a 160-as indexértékő rekordot! n=3 37 150 156 179 160 179 180 0 1 150 180 180 0 160

Szúrjuk be a 45-ös indexértékő rekordot! n=3 új gyökér 38 1 2 3 12 25 32 45

Töröljük az 50-es indexértékő rekordot! n=4 50 0 39

Töröljük az 50-es indexértékő rekordot! n=4 35 35 50 0 35

Töröljük a 37-es indexértékő rekordot! n=4 25 25 45 új gyökér 41 1 3 14 22 25 26 37

Hasítóindex-szervezés (Hashelés): a rekordokat blokkláncokba (bucket kosár) soroljuk és a blokklánc utolsó blokkjának elsı üres helyére tesszük a rekordot a beérkezés sorrendjében. a blokkláncok száma elıre adott: K (statikus hasítás) a tárolt adatok alapján változhat (dinamikus hasítás) A besorolás az indexmezı értékei alapján történik. Egy h(x) {1,...,K} hasító függvény értéke mondja meg, hogy melyik kosárba tartozik a rekord, ha x volt az indexmezı értéke a rekordban. A hasító függvény általában maradékos osztáson alapul. Például mod(k). Akkor jó egy hasító függvény, ha nagyjából egyforma hosszú blokkláncok keletkeznek, azaz egyenletesen sorolja be a rekordokat. Jó hasító függvény esetén a blokklánc B/K blokkból áll. 42

Keresés (A=a) ha az indexmezı és keresési mezı eltér, akkor kupac szervezést jelent, ha az indexmezı és keresési mezı megegyezik, akkor csak elég a h(a) sorszámú kosarat végignézni, amely B/K blokkból álló kupacnak felel meg, azaz B/K legrosszabb esetben. A keresés K- szorosára gyorsul. Miért nem érdemes nagyon nagy K-t választani? Tárméret: B, ha minden blokk nagyjából tele. Nagy K esetén sok olyan blokklánc lehet, amely egy blokkból fog állni, és a blokkban is csak 1 rekord lesz. Ekkor a keresési idı: 1 blokkbeolvasás, de B helyett T számú blokkban tároljuk az adatokat. Módosítás: B/K blokkból álló kupac szervezéső kosarat kell módosítani. Intervallumos (a < A < b) típusú keresésre nem jó. 43

Tegyük fel, hogy 1 blokkba 2 rekord fér el. Szúrjuk be a következı hasító értékkel rendelkezı rekordokat! INSERT: h(a) = 1 h(b) = 2 h(c) = 1 h(d) = 0 h(e) = 1 0 1 2 3 d a c b e 44

Töröljük a következı hasító értékkel rendelkezı rekordokat! (A megüresedett túlcsordulási blokkokat megszüntetjük.) Delete: e f c 0 1 2 a b c e d d 3 f g A g -t felcsúsztatjuk. 45

Dinamikus hasító indexek: kiterjeszthetı (expandable) lineáris Elıre nem rögzítjük a kosarak számát, a kosarak száma beszúráskor, törléskor változhat. Kiterjeszthetı hasító index: Minden kosár 1 blokkból áll. Keresési költség: 1. Legyen k > log (a rekordok várható számának felsı korlátja), azaz k hosszú bináris sorozatból több van, mint ahány rekord A h hasító függvény értéke egy k hosszú bináris sorozat. Minden kosárhoz tartozik egy legfeljebb k hosszú bináris sorozat (kódszó). A kosarakhoz rendelt kód prefix kód. A maximális kód hossza legyen i. A h(k) k hosszú kódnak vegyük az i hosszú elejét, és azt kosarat, amelynek kódja a h(k) kezdı szelete. Ha van hely a kosárban, tegyük bele a rekordot, ha nincs, akkor nyissunk egy új kosarat, és a következı bit alapján osszuk ketté a telített kosár rekordjait. Ha ez a bit mindegyikre megegyezik, akkor a következı bitet vesszük a szétosztáshoz, és így tovább. 46

0 1 00 11 11 beszúrása 2. bit alapján 0 00 1 0 1 11 11 0 1 11 47

A bináris fa levelei a kosárblokkok kódszavai. A hasító függvény értékébıl annyi bitet használunk, ahányadik szinten szerepel a levél. A gráfot a memóriában tárolhatjuk. Probléma: Ha az új sorok hasító értékének eleje sok bitben megegyezik, akkor hosszú ágak keletkezhetnek. (Nincs kiegyensúlyozva a fa.) 48

i = 1 A bináris gráfot teljessé is tehetjük. A gráfot egy tömbbel ábrázolhatjuk. Ekkor minden kosár azonos szinten lesz, de közös blokkjai is lehetnek a kosaraknak. Túlcsordulás esetén a kosarak száma duplázódik. Legyen például h(k) 4 bites és 2 rekord férjen egy blokkba. Az i jelzi, hogy hány bitet használunk fel. 1 0001 i = 2 00 01 Szúrjuk be az értékő sort! 1 2 01 10 11 Insert 1 2 10 Az új tömb mérete duplázódik. 49

Szúrjuk be most a 0111 és 0000 értékő sorokat! i = 00 01 11 2 Insert: 0111 0000 2 0000 0001 1 2 0001 0111 2 01 2 10 0111 50

Szúrjuk be az 01 sort! i = 00 01 2 0000 2 0001 0111 2 i = 3 000 001 0 11 01 01 3 011 0 01 2 3 1 Insert: 1 01 10 2 111 51

Lineáris hasító index: A kosarak 1 vagy több blokkból is állhatnak. Új kosarat akkor nyitunk meg, ha egy elıre megadott értéket elér a kosarakra jutó átlagos rekordszám. (rekordok száma/kosarak száma > küszöb) A kosarakat 0-tól kezdve sorszámozzuk, és a sorszámot binárisan ábrázoljuk. Ha n kosarunk van, akkor a hasító függvény értékének utolsó log(n) bitjével megegyezı sorszámú kosárba tesszük, ha van benn hely. Ha nincs, akkor hozzáláncolunk egy új blokkot és abba tesszük. Ha nincs megfelelı sorszámú kosár, akkor abba a sorszámú kosárba tesszük, amely csak az elsı bitjében különbözik a keresett sorszámtól. 52

Legyen a hasító érték 4 bites, i =2, és 2 rekord férjen egy blokkba. 01 Szúrjuk be a 01 értékő rekordot! Túlcsordulási blokkot nyitunk. 0000 01 1111 00 01 11 Még nem használt kosarak m = 01 (a legnagyobb sorszámú blokk sorszáma) Szabály: Ha h(k)[i ] m, akkor a rekordot tegyük a h(k)[i ] kosárba, különben pedig a h(k)[i ] - 2 i -1 kosárba! Megjegyzés: h(k)[i ] és h(k)[i ] - 2 i -1 csak az elsı bitben különbözik! 53

01 insert 01 0000 01 01 1111 1111 00 01 11 m = 01 (legnagyobb használt sorszám) 11 Késıbb felhasználható kosarak Tegyük fel, hogy átléptük a küszöbszámot, és ezért új kosarat kell nyitni, majd az elsı bitben különbözı sorszámú kosárból át kell tenni ebbe az egyezı végzıdéső rekordokat. 54

i = 2 3 Ha i bitet használunk és 2 i kosarunk van, akkor a következı kosárnyitás elıtt i-t megnöveljük 1-gyel, és az elsı bitben különbözı sorszámú kosárból áttöltjük a szükséges rekordokat és így tovább. 0000 01 01 1111 000 001 0 011 0 1 1 111 m = 11 (max used block) 0 1 0 01 01 1... 55

Rendezett állomány Egy rendezı mezı alapján rendezett, azaz a blokkok láncolva vannak, és a következı blokkban nagyobb értékő rekordok szerepelnek, mint az elızıben. Ha a rendezı mezı és keresı mezı nem esik egybe, akkor kupac szervezést jelent. Ha a rendezı mezı és keresı mezı egybeesik, akkor bináris (logaritmikus) keresést lehet alkalmazni: beolvassuk a középsı blokkot, ha nincs benne az A=a értékő rekord, akkor eldöntjük, hogy a blokklánc második felében, vagy az elsı felében szerepelhet-e egyáltalán, beolvassuk a felezett blokklánc középsı blokkját, addig folytatjuk, amíg megtaláljuk a rekordot, vagy a vizsgálandó maradék blokklánc már csak 1 blokkból áll. Keresési idı: log 2 (B) 56

Beszúrás: keresés + üres hely készítés miatt a rekordok eltolása az összes blokkban, az adott találati blokktól kezdve (B/2 blokkot be kell olvasni, majd az eltolások után visszaírni=b mővelet) Szokásos megoldások: Győjtı (túlcsordulási) blokk használata: az új rekordok számára nyitunk egy blokkot, ha betelik hozzáláncolunk egy újabb blokkokat, keresést 2 helyen végezzük: log 2 (B-G) költséggel keresünk a rendezett részben, és ha nem találjuk, akkor a győjtıben is megnézzük (G blokkmővelet, ahol G a győjtı mérete), azaz az összköltség: log 2 (B-G)+G ha a G túl nagy a log 2 (B) hez képest, akkor 57 újrarendezzük a teljes fájlt (a rendezés költsége B*log 2 (B)).

Üres helyeket hagyunk a blokkokban: például félig üresek a blokkok: a keresés után 1 blokkmővelettel visszaírjuk a blokkot, amibe beírtuk az új rekordot, tárméret 2*B lesz keresési idı: log 2 (2*B) = 1+log 2 (B) ha betelik egy blokk, vagy elér egy határt a telítettsége, akkor 2 blokkba osztjuk szét a rekordjait, a rendezettség fenntartásával. Törlés: keresés + a törlés elvégzése, vagy a törlési bit beállítása után visszaírás (1 blokkírás) túl sok törlés után újraszervezés 58 Frissítés: törlés + beszúrás