Adatbázis-kezelés · Belső szint

A belső szint: tárolás és adatelérés

Hogyan találja meg az adatbázis a keresett rekordot? Eszközkölcsönzős példákon vizsgáljuk a lapokat, a puffert, a rendezést, az indexeket, a B+ fát és a hashinget.

Lapok és pufferIndex és B+ faHashing és ütközéskezelés14 önellenőrző feladat

01 · Belső szint

Mit tervezünk a belső szinten?

AlapfogalomA belső, fizikai szint azt írja le, hogyan helyezkednek el az adatok a tárolóban, és milyen hozzáférési szerkezetek segítségével találhatók meg. A logikai reláció és annak fizikai megvalósítása két külön nézőpont.

A relációs modellben az ESZKÖZ reláció attribútumai például az eszköz_id, megnevezés, kategória és beszerzés_dátuma. A belső szinten azt vizsgáljuk, hogyan kerülnek ezek a rekordok lapokra, hogyan jutnak a memóriába, és hogyan kereshető ki gyorsan egy adott eszköz. A tárolási részleteket az adatbázis-kezelő szervezi; a tervező az indexekkel és más beállításokkal befolyásolhatja a hozzáférést.

Ugyanaz a logikai adat más fizikai szervezéssel is tárolható. Ha egy táblához új indexet hozunk létre, nem változik meg a kurzus vagy eszköz jelentése, és a lekérdezésnek továbbra is ugyanazokat a megfelelő rekordokat kell visszaadnia. Az index a keresés költségét változtatja meg. Ez a fizikai adatfüggetlenség egyik gyakorlati megnyilvánulása.

Fő példánk egy iskolai eszközkölcsönző. Az eszköz_id egyedi azonosító, a kategória viszont ismétlődhet: több laptop és több kamera van. Egyrészt konkrét eszközöket keresünk id alapján, másrészt kategóriánként vagy id-tartományban kérünk listát. Az eltérő kérdések eltérő hozzáférési módoknak kedveznek.

Az alábbi blokkok, címek, kapacitások és költségszámok szemléltető modellhez tartoznak. Nem egy konkrét adatbázis-kezelő általános beállításai. A fő elv az, hogy nemcsak az számít, hány rekordot hasonlítunk össze: az is fontos, hány adatlapot kell beolvasni a háttértárolóból.

Három szint, háromféle kérdés
SzintPéldakérdésPéldaválasz
KülsőMit láthat a kölcsönző tanuló?A szabad eszközök neve és elérhetősége.
LogikaiMilyen tényeket tárolunk?ESZKÖZ, TANULÓ, KÖLCSÖNZÉS relációk és kapcsolataik.
BelsőHogyan keresünk gyorsan egy eszközt?Lapok, puffer és az eszköz_id-hoz tartozó index.

02 · Belső szint

Mágneslemez és SSD: miért drága a háttértár elérése?

AlapfogalomA háttértár tartósan tárolja az adatokat. Mágneslemeznél az adatelérés mechanikai mozgást is igényel, SSD-nél nincs forgó lemez és mozgó olvasófej; mindkét esetben lényeges a memória és a háttértár közötti adatmozgatás.

A hagyományos HDD lemezfelületein az adatok koncentrikus sávokhoz kapcsolódnak. Az azonos sugáron lévő sávok együttese a klasszikus lemezmodellben cilinder. Egy sáv kisebb szektorokra oszlik. Az író-olvasó fej helyzetét és a lemez forgását is figyelembe kell venni, amikor egy adott területet elérünk.

A hozzáférés szemléltető lépései: a fej megfelelő sávhoz mozgatása, a megfelelő felület kiválasztása, várakozás a kívánt hely odafordulására, végül adatátvitel. Ezek közül a keresési idő és a forgási várakozás mechanikai összetevő. A közeli vagy egymást követő adatok olvasása ezért előnyös lehet a szétszórt véletlen eléréshez képest.

Az SSD flashmemóriában tárol, ezért a sáv, cilinder és fejmozgás nem az SSD működésének leírása. Ettől még az SSD-s adatbázisban sem ingyenes minden véletlen olvasás: számít az I/O műveletek száma, az átvitel mérete, a vezérlő, a párhuzamosság és a puffer találati aránya. A logikai blokkszám nem feltétlenül árulja el a tényleges fizikai elhelyezést.

A mágnesszalag egymás utáni hozzáférésre alkalmas tároló. Nagy mennyiségű archív vagy mentési adatnál lehet szerepe, de egy aktív adatbázis tetszőleges rekordjának gyors kikeresésére más hozzáférési lehetőséget kívánunk. Az adatbázis mentése és az élő adatbázis tárolási szerkezete nem azonos feladat.

Klasszikus HDD-fogalmak
FogalomJelentésMire figyelünk?
LemezfelületEgy tárolólemez adatot hordozó felülete.A fej a megfelelő felületet éri el.
SávKör alakú adattárolási pálya.A fej megfelelő sugárra áll.
CilinderAzonos sugarú sávok együttese.Klasszikus lemezgeometriai fogalom.
SzektorA felület kisebb címezhető egysége.Nem azonos automatikusan az adatbázis lapméretével.

Kidolgozott példa · Szemléltető elérési idő

Egy HDD-n a keresés 4 ms, a forgási várakozás 3 ms, az átvitel 1 ms.

  1. A szemléltető összeg 4 + 3 + 1 = 8 ms.
  2. Tíz külön, pufferből ki nem szolgálható véletlen olvasás ebben a leegyszerűsített modellben 80 ms.
  3. Ez nem általános mérési eredmény: gyorsítótár, egymás utáni olvasás és párhuzamosság módosíthatja a tényleges időt.

03 · Belső szint

Rekordok, lapok és puffer

AlapfogalomAz adatbázislap több rekordot vagy indexbejegyzést tartalmazó logikai tárolási egység. A puffer az adatbázis-kezelő memóriaterülete, amely a már beolvasott lapokat és azok esetleges módosításait tartja nyilván.

A rekordok nem szükségképpen egyenként kerülnek a memóriába: a kezelő rendszerint egész lapot olvas be. Ha egy oldalon több eszközrekord van, a beolvasás után ezeket további háttértár-elérés nélkül vizsgálhatjuk. Az operációs rendszer blokkja, a meghajtó szektora és az adatbázis lapja eltérő rétegek fogalmai; méretüknek nem kell megegyeznie.

Egy lapnak a rekordokon kívül fejléc és egyéb szervezési adatok is helyet foglalnak. Változó hosszúságú rekordoknál a kapacitás sem állandó. Ha egy példában fix rekordhosszal számolunk, külön megadjuk a használható helyet, és lefelé kerekítjük az elférő rekordok számát. Nem lehet a maradék fél rekordot elhelyezni.

Puffertalálat esetén a kért lap már rendelkezésre áll a memóriában, így nincs hozzá új fizikai beolvasás. Pufferhiba, vagyis cache miss esetén a lapot be kell olvasni. A puffer mérete véges, ezért a rendszer megfelelő szabályokkal lecseréli a régebbi lapok egy részét. A gyakran használt indexgyökér például sok keresésnél memóriában maradhat.

Íráskor a memóriabeli lap módosulhat, és piszkos, módosított lappá válik. Az adatbázis-kezelő a tartósság és helyreállítás szabályai szerint írja ki az adatokat és naplóinformációkat. Nem igaz általánosan, hogy minden SQL-módosítás azonnal, közvetlenül a teljes adatlapot írja lemezre. A naplózás részletes működése külön témakör.

Kidolgozott példa · Lapkapacitás és lapszám

A lap 4096 bájtos, a fejléc és egyéb fenntartott terület 96 bájt, egy fix rekord 200 bájt. 95 rekordot tárolunk.

  1. Használható terület: 4096 − 96 = 4000 bájt.
  2. Rekord/lap: ⌊4000 / 200⌋ = 20.
  3. Szükséges lapszám: ⌈95 / 20⌉ = 5.
  4. Négy teljes lap 80 rekordot tartalmaz, az ötödikben 15 rekord van. A számítás a megadott, egyszerűsített rekordformátumra igaz.
Logikai olvasás és fizikai olvasás
HelyzetLogikai lapkérésÚj háttértár-olvasás
A kért lap nincs a pufferben11
Ugyanazt a lapot újra kérjük, és még bent van10
A lap időközben kiszorult11

04 · Belső szint

Rendezetlen és rendezett állomány

AlapfogalomRendezetlen, heap állománynál a rekordok sorrendjét nem egy kiválasztott keresési kulcs értéke határozza meg. Rendezett állományban a rekordok egy választott mező vagy mezőkombináció szerinti logikai sorrendben helyezkednek el.

Heap állománynál a beszúrás általában szabad helyet keres, vagy új lapot foglal. Ha nincs megfelelő index, egy adott id-t a lapok és rekordok átvizsgálásával találunk meg. A rendezetlen nem jelent véletlenszerű értéket, adatvesztést vagy hibás adatbázist: csak azt, hogy a fizikai szervezés nem adja meg a keresési kulcs szerinti sorrendet.

Rendezett állományban a kisebb keresési kulcsértékek megelőzik a nagyobbakat. Az eszköz_id szerinti rendezés az id-keresést és id-tartomány bejárását segítheti. A kategória szerinti keresés azonban nem követi ezt a sorrendet: a laptopok több külön helyre kerülhetnek. Egyetlen fizikai rendezés nem tud minden lehetséges szempontnak egyszerre megfelelni.

A rendezett állomány beszúrása több munkával járhat. Ha két meglévő rekord közé érkezik új id, helyet kell találni a megfelelő környezetben; szükség lehet mozgatásra, lapfelosztásra vagy túlcsorduló területre. Tartalék üres hely csökkentheti az azonnali átrendezések számát, de tárolókapacitást foglal.

A rekordok logikai sorrendje nem feltétlenül azonos a meghajtó tényleges geometriai sorrendjével. A kezelő, a fájlrendszer és a meghajtó külön rétegeket kezel. SQL-eredményben sem szabad az aktuális tárolási sorrendre hagyatkozni: ha meghatározott sorrend kell, ORDER BY-t írunk.

Két lehetséges rekordelhelyezés
LapHeap állomány: id-kId szerint rendezett állomány: id-k
B1140, 102, 170102, 107, 111
B2107, 155, 118118, 125, 132
B3183, 111, 147140, 147, 155
B4132, 125, 162162, 170, 183

Kidolgozott példa · Az új 120-as eszköz

A rendezett példában 118 és 125 közé új rekord érkezik.

  1. A megfelelő logikai hely a B2 környezetében van.
  2. Ha a lapban van szabad hely, oda kerülhet.
  3. Ha megtelt, a szervezéstől függően átrendezés vagy lapfelosztás szükséges. A heap változatban nem az id szerinti helyet keressük.

05 · Belső szint

Szekvenciális, közvetlen és bináris keresés

AlapfogalomA szekvenciális elérés egymás után vizsgálja az elemeket. Közvetlen elérésnél ismert lapazonosító alapján kérjük a megfelelő lapot. A bináris keresés rendezett keresési térben, felezéssel szűkíti a lehetséges helyeket.

Index nélküli heap állományban a keresett id előfordulhat bármelyik lapon. A lineáris keresés addig halad, amíg megtalálja, vagy elfogynak az adatok. Ha a kulcs egyedi, megtaláláskor megállhatunk. Ha ismétlődő kategóriát keresünk és minden találat kell, a teljes állományt is végig kell vizsgálni.

Rendezett állománynál a lapok minimuma és maximuma alapján eldönthető, hogy a keresett kulcs balra, jobbra vagy az adott lap tartományában lehet. A bináris keresés a középső lapot vizsgálja, majd a megfelelő féllel folytatja. Miután megvan a szóba jövő lap, azon belül még meg kell találni a rekordot.

A 147-es id-t négy rendezett lapban keressük. Kezdetben az alsó lapindex 1, a felső 4, a lefelé kerekített közép 2. B2-ben 118–132 az értéktartomány, tehát jobbra lépünk. Az új közép B3, tartománya 140–155; itt ellenőrizzük a rekordokat és megtaláljuk 147-et.

A 150-es id ugyanígy B3 tartományába esik, de a benne lévő 140, 147 és 155 egyikével sem egyezik. A tartományba esés csak lehetséges helyet jelent, nem sikeres találatot. Ha egy lapról jobbra vagy balra lépve az alsó határ nagyobb a felsőnél, a keresés szintén sikertelen.

A bináris keresés rendezést és a kiválasztott középső lap elérhetőségét kívánja. Egy mágnesszalag vagy általános láncolt lista esetén a középső elemre ugrás nem feltétlenül olcsó. A logaritmikus összehasonlítási szám ezért nem minden adatszerkezetben jelent logaritmikus teljes elérési időt.

Kidolgozott példa · Lineáris és bináris keresés 147-re

A B1–B4 rendezett tárolási példát használjuk, kezdetben üres pufferrel.

  1. Lineárisan B1, B2, B3 kerül sorra: 3 adatlapot kérünk.
  2. Binárisan B2, majd B3 kerül sorra: 2 adatlapot kérünk.
  3. A B3 belsejében a 147-es rekordot is ellenőrizni kell.
  4. A példa kis mérete miatt a nyereség kicsi. Nagy állományban a felezés sokkal több lapvizsgálatot takaríthat meg.

A bináris lapkeresés menete

alsó = 1; felső = a lapok száma

amíg alsó ≤ felső: közép = ⌊(alsó + felső) / 2⌋

ha K < a középső lap első kulcsa: felső = közép − 1

ha K > a középső lap utolsó kulcsa: alsó = közép + 1

különben: keress a középső lap rekordjai között; majd fejezd be

ha elfogyott a lapintervallum: nincs találat

06 · Belső szint

Index és elsődleges, ritka index

AlapfogalomAz index külön hozzáférési szerkezet, amely keresési kulcsértékeket és a megfelelő adatokhoz vezető hivatkozásokat tartalmaz. Nem a teljes adatállományt kell benne újra eltárolni.

Ha minden kereséskor a hosszú adatlapokat vizsgáljuk, sok háttértár-olvasásra lehet szükség. Az index bejegyzései rövidebbek lehetnek, így több fér egy lapra. A keresési értékhez először az indexben találjuk meg a megfelelő hivatkozást, majd elérjük az adatlapot vagy rekordot.

A klasszikus rendezett állomány elsődleges indexe a rendezési kulcsra épül. Ha a kulcs egyedi, és minden adatlap első értékét tesszük az indexbe, ritka indexet kapunk: nem minden rekordnak van saját bejegyzése. A rendezés teszi lehetővé, hogy az indexben meg nem jelenő 147-es kulcsot is a megfelelő laptartományhoz rendeljük.

A fő példában az index (102, B1), (118, B2), (140, B3), (162, B4) párokat tartalmaz. A 147 keresésekor az indexben a legnagyobb olyan kezdőkulcsot keressük, amely nem nagyobb 147-nél. Ez 140, tehát B3-at olvassuk. Az index itt a lapra vezet, a pontos találatot a lapon belül ellenőrizzük.

A ritka index nem használható ugyanezzel a logikával rendezetlen kategóriaértékekhez: egy B1-es laptop nem zárja ki, hogy B4-en is legyen laptop. Sűrű index esetén minden rekordhoz vagy minden keresési értékhez megfelelő, összes találatra vezető bejegyzés tartozik. Az elsődleges és másodlagos index megnevezését mindig az adott tárolási modellben értelmezzük.

A mai adatbázis-kezelőkben az index nem feltétlenül önálló, a felhasználó által kezelt fájl. A mutató sem feltétlenül nyers lemezcím: lehet lap–rekord helyazonosító vagy egy másik index kulcsa. A konkrét rendszer döntéseit ne következtessük pusztán az „elsődleges kulcs” kifejezésből.

Ritka, elsődleges index
Az adatlap első id-jeAdatlap
102B1
118B2
140B3
162B4

Kidolgozott példa · Két közeli keresés

147-et, majd 150-et keresünk ugyanebben a rendezett állományban.

  1. Mindkét kulcshoz a 140-es kezdőbejegyzést választjuk, tehát B3 a lehetséges lap.
  2. 147 a lapon szerepel: találat.
  3. 150 nem szerepel: nincs találat.
  4. Az index eligazít, de a kezdőkulcs kiválasztása még nem igazolja a keresett rekord létezését.

07 · Belső szint

Másodlagos index: keresés más szempontból

AlapfogalomA másodlagos index olyan keresési mezőhöz ad hozzáférést, amely nem határozza meg az adatállomány sorrendjét. A megfelelő rekordokra vezető hivatkozásokat minden lehetséges találathoz meg kell őriznie.

Az eszközök id szerint rendezettek, de a kölcsönző gyakran az összes kamerát keresi. A kategória szerinti index a kategóriaértékhez rendeli a megfelelő rekordhelyeket. A kamerák lehetnek B1-en, B2-n és B4-en is: a kategóriák sorrendjéből nem következik az adatlapok sorrendje.

Ha a másodlagos keresési mező egyedi, egy értékhez egy rekord tartozik. Ez nem azt jelenti, hogy minden másodlagos index egyedi. A kategória ismétlődő érték, ezért egyetlen rekordhely eltárolása elveszítené a további találatokat.

Az ismétlődések többféleképpen kezelhetők. Tárolhatunk azonos kulcsértékkel több bejegyzést, egy kulcshoz változó hosszú helylistát, vagy külön mutatólistára hivatkozást. A konkrét szerkezet rendszerfüggő, de a lényeg ugyanaz: az összes érintett rekordnak elérhetőnek kell lennie.

Az indexben talált rekordhely után az adatokat még be kell olvasni, ha a lekérdezés olyan attribútumot kér, amely nincs benne az indexben. Sok különböző adatlap érintése költséges lehet. Ha a szűrés a tábla nagy részét visszaadja, egy teljes bejárás olcsóbb lehet, mint sok külön indexen átvezetett adatelérés.

Az egyediség és a hozzáférés két külön tulajdonság. Egy nem egyedi INDEX gyorsíthat, de nem tiltja az ismétlődést. A UNIQUE korlátozás és megfelelő egyedi index az üzleti szabály védelmét is szolgálhatja. Ne tegyük a kategóriát egyedivé csak azért, hogy könnyebb legyen lerajzolni az indexet.

Adatrekordok és szemléltető rekordhelyek
eszköz_idkategóriahely
102kameraB1:r1
107laptopB1:r2
111tabletB1:r3
118kameraB2:r1
125laptopB2:r2
132tabletB2:r3
140laptopB3:r1
147laptopB3:r2
155tabletB3:r3
162kameraB4:r1
170laptopB4:r2
183tabletB4:r3
Másodlagos index helylistával
Keresési értékA hozzá tartozó összes rekordhely
kameraB1:r1, B2:r1, B4:r1
laptopB1:r2, B2:r2, B3:r1, B3:r2, B4:r2
tabletB1:r3, B2:r3, B3:r3, B4:r3

Kidolgozott példa · Az összes kamera keresése

Az id szerint rendezett eszközállományban a kamera kategóriát keressük.

  1. A másodlagos indexben megkeressük a kamera bejegyzést.
  2. A helylista 3 rekordra, összesen 3 külön adatlapra vezet.
  3. A már pufferben lévő lapot nem kell újra háttértárból olvasni.
  4. A három találat nem következik abból, hogy egyetlen kameraindex-bejegyzés van: a bejegyzés listája adja meg őket.

08 · Belső szint

Csoportosító index és fizikai közelség

AlapfogalomA csoportosító szervezés egy mező azonos vagy közeli értékéhez tartozó rekordokat egymás közelében tárol. Az ilyen szervezéshez kapcsolódó index a csoport vagy tartomány helyét segít megtalálni.

Ha a kölcsönző szinte mindig kategóriánként listáz, a kamerák, laptopok és tabletek csoportos tárolása hasznos lehet. Az azonos kategóriájú eszközök így kevesebb különálló lapot érintenek. A kategória nem egyedi; az eszköz_id ettől továbbra is egyedi azonosító marad.

Egy csoport több lapot is elfoglalhat. A kezdőmutató után addig követjük a rendezett csoport lapjait vagy rekordjait, amíg a kategória meg nem változik. A csoport első lapjának címével nem feltétlenül kaptuk meg az összes találatot.

A csoportos tárolás ára, hogy más keresések vagy beszúrások eltérő költségűek lehetnek. Ugyanaz a rekordhalmaz nem tud egyszerre több különböző teljes fizikai sorrendben állni. Más szempontokhoz további hozzáférési szerkezetek készülhetnek.

A „clustered index” szóhasználata adatbázis-kezelőnként eltérhet. InnoDB-ben a sorok a clustered index levélszintjén tárolódnak, és ennek kulcsa rendszerint az elsődleges kulcs. Ez nem automatikusan a klasszikus, nem egyedi kategória szerinti csoportosító index. A fogalmat mindig a konkrét tárolási rendszer leírásával együtt értelmezzük.

Kategória szerint csoportosított minta
LapKategóriaEszközök
G1kamera102, 118, 162
G2laptop107, 125, 140
G3laptop147, 170
G4tablet111, 132, 155
G5tablet183

Kidolgozott példa · Kamerák és laptopok

A szemléltető lapok legfeljebb 3 rekordot tartalmaznak.

  1. A 3 kamera egyetlen csoportlapban található.
  2. Az 5 laptop két egymás utáni csoportlapot igényel.
  3. Ez a szervezés kategórialekérdezéshez kedvező, de id szerint már nem ugyanaz a tárolási sorrend.

09 · Belső szint

Többszintű index és B+ fa

AlapfogalomA B+ fa kiegyensúlyozott, többágú keresési szerkezet. A belső csomópontok elválasztó kulcsai irányítják a keresést; a levélszinten vannak az adateléréshez szükséges bejegyzések, és a levelek rendezett bejárást is támogathatnak.

Ha egy index már sok lapból áll, annak keresését újabb, kisebb indexszint gyorsíthatja. A többszintű szerkezet tetején egy gyökérlap áll, alatta további belső lapok, végül levéllapok. Nagy elágazási szám mellett kevés szint is sok rekordhoz vezet.

A B+ fa levelei azonos mélységben találhatók. Ezért nem fordul elő, hogy egy szerencsétlenül kialakult hosszú lánc miatt egyes kulcsokhoz sokkal több szintet kell bejárni. Egy belső csomópont több gyermekre vezethet; nem szabad összekeverni a bináris keresőfával, amelynek csomópontjai legfeljebb két gyermekkel rendelkeznek.

A szemléltető gyökér 118, 140 és 162 elválasztó értékeket tárol. A hozzá tartozó négy tartomány: K < 118; 118 ≤ K < 140; 140 ≤ K < 162; 162 ≤ K. A 147 a harmadik levélbe kerül. Az elválasztóérték-egyezés ebben a jelölésben a jobb oldali tartományt választja; a szabályt az ábrával összhangban kell használni.

A levél bejegyzése további adatrekordhoz vezethet, vagy egyes tárolási rendszerekben maga a levél tartalmazza a teljes sort. Külön levélindex és adatlap esetén a gyökér–levél bejárás után további adatlap-olvasás szükséges lehet. Ha a gyökér a pufferben van, nem kell azt minden alkalommal újra háttértárból olvasni.

Tartománykereséskor megkeressük az alsó határ megfelelő levelét, majd a rendezett levélláncon haladunk, amíg a felső határt el nem érjük. A 125–162 közötti, zárt intervallum találatai: 125, 132, 140, 147, 155 és 162. A hashvödör beosztásából ez a sorrendi szomszédság nem következik.

Beszúráskor egy tele levél felosztható, az új elválasztóérték a szülőbe kerül. Ha a szülő is megtelik, a változás felfelé terjedhet. A gyökér felosztása növelheti a magasságot. A cél nem a teljes állomány újrarendezése minden beszúráskor, hanem a kiegyensúlyozott, lapokhoz illeszkedő szerkezet fenntartása.

B+ fa: elválasztókulcsok és összekapcsolt levelek
Gyökér – elválasztókulcsok118 | 140 | 1621. levél102 · 107 · 111K < 1182. levél118 · 125 · 132118 ≤ K < 1403. levél140 · 147 · 155140 ≤ K < 1624. levél162 · 170 · 183162 ≤ K

Például 147-re lesz találat, 150-re nem. A 162 a negyedik levél első kulcsa.

Szemléltető, kétszintű fa. A levélszinten az id-khez tartozó adathivatkozásokat az áttekinthetőség kedvéért nem rajzoltuk ki. A vízszintes nyilak a rendezett levélbejárást jelölik.

Kidolgozott példa · Lapszintű költség

Egy tanulási modellben a gyökér–belső csomópont–levél út 3 indexlapot érint, a rekord egy külön adatlapon van.

  1. Üres pufferrel a lehetséges olvasások száma 3 + 1 = 4.
  2. Ha a gyökér és belső lap már pufferben van, két új olvasás is elegendő lehet.
  3. Ha a levél maga tárolja a teljes rekordot, nincs külön adatlap-hozzáférés.
  4. Tartomány esetén a további levél- és adatlapokat is számolni kell: nem minden lekérdezés költsége a fa magassága.

10 · Belső szint

Hashing: a kulcsból vödör

AlapfogalomA hashing egy determinisztikus hashfüggvénnyel vödröt választ a keresési kulcshoz. Ugyanaz a kulcs ugyanabba a vödörbe kerül, de különböző kulcsok is kaphatnak azonos hashértéket: ezt ütközésnek nevezzük.

A hashing az indexben történő sorrendi keresés helyett a kulcsból számít egy elérési útvonalat. A szemléltető egész kulcsú függvény h(K) = K mod 7, ahol a vödrök száma 7, az eredmény 0 és 6 közé esik. A függvény egy vödör azonosítóját adja, nem egy általánosan közvetlenül használható, végleges lemezcímet.

A 103, 110 és 117 kulcsok mind 5 maradékot adnak. Ez szabályos ütközés: a három eszköz különböző, csak a kiválasztott vödör azonos. A rekord megkereséséhez az eredeti kulcsot is ellenőrizni kell. A hashérték egyezése nem bizonyítja, hogy két rekord ugyanahhoz az eszközhöz tartozik.

Jó eloszlásnál a vödrök nem telítődnek néhány helyen, miközben a többi szinte üres. A függvény választását a kulcsok tényleges eloszlásával együtt értékeljük. A prímszám modulus bizonyos mintázatoknál hasznos lehet, de nem garantál ütközésmentességet vagy tökéletes egyenletességet.

A hashalapú hozzáférés pontos egyenlőségi kereséshez kedvező lehet. A 117-es id-hez gyorsan kiválasztjuk az 5-ös vödröt. A 100–150 közötti id-tartományhoz azonban nem kapunk egyetlen szomszédos vödörsorozatot: a numerikus sorrend nem őrződik meg. Ezért más adatszerkezet jobb lehet tartományokhoz.

Az adatbázisbeli hash-hozzáférés nem azonos a jelszavak biztonságos hash-elésével, és nem adatazonosításra használt kriptográfiai ujjlenyomat. Itt a rekordok tárolási helyének kiválasztása a cél; a biztonsági jelszókezelés egészen más követelményekkel működik.

h(K) = K mod 7
Eszköz-id KSzámításVödör
103103 = 14·7 + 55
110110 = 15·7 + 55
117117 = 16·7 + 55
125125 = 17·7 + 66
134134 = 19·7 + 11
142142 = 20·7 + 22

Kidolgozott példa · A 117-es id keresése

Az 5-ös vödörben 103, 110 és 117 található.

  1. Kiszámítjuk: 117 mod 7 = 5.
  2. Az 5-ös vödröt kérjük, és ellenőrizzük az eredeti kulcsokat.
  3. 103 és 110 nem egyenlő a keresett kulccsal; 117 igen.
  4. A 124 keresése szintén az 5-ös vödörbe vezetne, de nem találat: a kulcsellenőrzés ekkor sem hagyható el.

11 · Belső szint

Ütközések és dinamikus bővítés

AlapfogalomÜtközéskezeléskor az azonos vödörbe kerülő különböző kulcsokat úgy tároljuk, hogy mindegyik visszakereshető maradjon. A dinamikus hash-szervezés a növekvő adatmennyiséghez igazítja a vödrök vagy a címtár szerkezetét.

Egy vödör több rekordot is tárolhat, de kapacitása véges. Ha megtelik, túlcsorduló lapot kapcsolhatunk hozzá, és a keresés a láncot is bejárja. Ha a lánc hosszú lesz, több háttértár-elérés szükséges: a hashing nem biztosít minden körülmények között egyetlen olvasást.

Az ütközésre nem megoldás, hogy az új rekorddal felülírjuk a régit. A 103, 110 és 117 külön adatrekord; mindegyiket meg kell őrizni. Kereséskor a teljes megfelelő vödör- és túlcsordulási lánc alapján mondhatjuk ki, hogy egy kulcs nincs jelen.

Dinamikus módszernél a hashérték egyes bitjei alapján további vödröket különítünk el. Egy címtár több bejegyzése is mutathat ugyanarra a vödörre. Ha egy vödröt felosztunk, újabb bit segít a rekordokat két részre osztani. Nem szükséges minden egyes túlcsorduláskor minden tárolt rekordot új helyre tenni.

Egy egyszerű bővíthető példában a vödrök kapacitása 2. Kezdetben az utolsó egy bit alapján választunk: a páros 2 és 4 az even vödörbe, a páratlan 3 és 7 az odd vödörbe kerül. Az 5 beszúrása túlcsordítaná az odd vödröt. Két bitet vizsgálva 5 vége 01, a 3 és 7 vége 11: szétválaszthatjuk őket.

Az új címtár 00, 01, 10 és 11 bejegyzést tartalmaz. A 00 és 10 még ugyanarra a páros vödörre mutat, mert azt nem bontottuk. A 01 az 5-öt, a 11 a 3-at és 7-et tartalmazó vödörre vezet. A példában két alacsony helyiértékű bitet használunk; más módszerek más bitválasztást és bővítési szabályt alkalmazhatnak.

Bővítés utáni címtár
Címtár utolsó 2 bit alapjánVödörTárolt kulcsok
00V_páros2, 4
01V_015
10V_páros2, 4
11V_113, 7

A 2 és 4 nem duplán tárolt rekord: a címtár két bejegyzése ugyanazt az egy vödröt hivatkozza.

Kidolgozott példa · Miért helyes a felosztás?

A régi odd vödörben 3 és 7 volt, újként 5 érkezik.

  1. Binárisan: 3 = 11, 7 = 111, 5 = 101.
  2. A két utolsó bit: 11, 11, illetve 01.
  3. Az új 01-es vödörbe 5 kerül, a 11-esbe 3 és 7.
  4. Mindegyik kulcs a számított új címtárbejegyzésből visszakereshető, és a kapacitás 2 alatt vagy 2-n marad.

12 · Belső szint

Hozzáférési mód választása és az index ára

AlapfogalomA hozzáférési szerkezetet a tényleges lekérdezési és módosítási igények alapján választjuk. Az index nyeresége és fenntartási költsége együtt határozza meg, hogy hasznos-e.

Pontos id-kereséshez rendezett index vagy megfelelő hash-hozzáférés lehet hasznos. Az id-k közötti tartományokhoz rendezett faindex alkalmasabb. A kategória szerinti összes találathoz másodlagos index segíthet, különösen akkor, ha kevés rekord érintett. Ha a lekérdezés a tábla majdnem minden sorát kéri, a teljes bejárás is jó választás lehet.

Minden index helyet foglal. Beszúrás, törlés és indexelt mező módosítása esetén karban kell tartani. Ha a kategóriát kamera értékről laptopra változtatjuk, a régi kategóriabejegyzést módosítani kell, és az új értékhez is elérhetővé kell tenni a rekordot. Az állomány és az index összhangjának megőrzése a kezelő feladata.

Az összetett indexek külön tervezést kívánnak. A (kategória, eszköz_id) sorrendű faindex a kategórián belüli id-ket rendezi. Ez nem ugyanaz, mint az (eszköz_id, kategória) index. Az oszlopok sorrendjét a keresési feltételekhez és a rendezési igényekhez igazítjuk; egyetlen kétoszlopos index nem válik automatikusan két független indexszé.

Az index használatáról rendszerint a lekérdezésoptimalizáló dönt. A döntésnél szerepet kaphat a találatok becsült száma, a tábla mérete, a puffer, a tároló és az index szerkezete. Az, hogy egy index létezik, nem jelenti, hogy minden érintett lekérdezésnél használni fogják. A tényleges végrehajtási terv és mért futás hasznosabb, mint a feltételezés.

Az indexek szerkezetétől függetlenül az eredmény helyességét meg kell őrizni. Index nélkül és indexszel ugyanarra az adatállapotra ugyanazok a feltételt teljesítő rekordok járnak; a teljesítmény változik. Az eredmény sorrendje külön előírás hiányában nem garantált.

A fő igények és jelöltek
IgényKedvező lehetMire figyelünk?
Egy eszköz egyedi id alapjánFaindex vagy hash-hozzáférésA konkrét kezelő által támogatott szerkezet.
125 és 162 közötti id-kRendezett faindexAz alsó határ után levéllánc-bejárás.
Az összes kameraKategória szerinti másodlagos indexAz összes találat és érintett adatlap.
Majdnem minden eszköz listájaTeljes állománybejárásAz indexhez képest a teljes költség lehet kisebb.
Sok beszúrás, kevés keresésVisszafogott indexszámMinden fölösleges index karbantartási terhet ad.

13 · Önellenőrzés

Önellenőrzés és hozzáférési terv

Először önállóan válaszolj, és indokold meg a döntésedet! A kérdés megnyitásakor megjelenik a megoldás és a magyarázat. A tervezési feladatban indokold meg a választott keresési szerkezetet és a lapolvasási költség becslését, majd vesd össze a mintamegoldással.

1. Mi a különbség az elsődleges kulcs és egy index között?

A PK logikai azonosítási és integritási szabály; az index hozzáférési szerkezet. Egy rendszer használhat indexet a PK védelméhez és gyors kereséséhez, de a fogalmak nem azonosak.

2. Egy lap 8192 bájt, 192 bájt fenntartott hellyel; egy fix rekord 250 bájt. Hány rekord fér rá, és hány lap kell 97 rekordhoz?

Használható terület 8000 bájt; ⌊8000/250⌋ = 32 rekord/lap. ⌈97/32⌉ = 4 lap, mert 3 lap csak 96 rekordot tartalmaz. A megadott modellben a negyedik lapon 1 rekord van.

3. Ugyanazt a lapot kétszer kérjük. Kell-e két háttértár-olvasás?

Nem feltétlenül. Ha a lap az első kérés után pufferben marad, a második logikai kérés találatként kiszolgálható. Ha időközben kiszorul, újra kell olvasni.

4. Miért nem használható egyszerűen bináris keresés egy id szerint rendezetlen állományban?

A felezés kizárja a keresési tér egyik felét, ami csak megfelelő sorrend esetén igazolható. A rendezetlen állomány másik felében ugyanúgy szerepelhet a keresett id.

5. A négy rendezett lapunkban melyik lapra vezet a 150-es id, és találat-e?

A 140-es kezdőindex B3-ra vezet, amelyben 140, 147 és 155 szerepel. 150 nincs benne, tehát nincs találat. A laptartomány megtalálása nem egyenlő a rekord megtalálásával.

6. A kamera másodlagos index helylistája B1:r1, B2:r1, B4:r1. Hány rekord és hány külön adatlap érintett?

3 rekord és 3 külön adatlap. A fizikai olvasások száma a pufferállapottól is függ. Ha mindhárom lap memóriában van, új háttértár-olvasás nem szükséges.

7. A B+ fa gyökerében 118, 140, 162 elválasztók vannak. A 162 melyik tartományba kerül?

Az ábra konvenciójában a negyedik, 162 ≤ K tartományba. Az egyenlőségi esetet tudatosan kell kezelni; a 162 itt a jobb oldali levél első kulcsa.

8. Mely id-k tartoznak a 125–162 zárt intervallumba a B+ fa példában?

125, 132, 140, 147, 155 és 162. A zárt határok miatt a 125 és 162 is szerepel. Az első megfelelő levéltől a következő leveleken át haladunk.

9. Mennyi h(124), ha h(K)=K mod 7? A 117 hashértékével való egyezés rekordazonosságot jelent?

h(124)=5, és h(117)=5. Ez ütközés; 124 és 117 külön kulcs. Az eredeti kulcsot a vödörben ellenőrizni kell.

10. Ha a vödör 2 rekordot tartalmazhat, és már benne van 103 és 110, mi történjen 117 beszúrásakor?

A régi rekordokat nem írjuk felül. A szervezésnek megfelelő túlcsorduló lap vagy dinamikus felosztás kell. Egyszerű láncolt példában a harmadik rekord külön túlcsorduló helyre kerül.

11. A bővíthető hash példában miért mutat 00 és 10 ugyanarra a páros vödörre?

A páros vödröt csak az utolsó egy bit különítette el, és azt nem bontottuk tovább. A nagyobb címtár két bejegyzése ezért ugyanarra a vödörre vezet. A rekordokat nem tároljuk kétszer.

12. Miért választhat az optimalizáló teljes bejárást létező index mellett?

Ha a feltétel sok sort ad vissza, az index bejárása és a sok szétszórt adatlap elérése drágább lehet. Az index lététől nem következik automatikus használat; becslések és tényleges költség alapján dönt.

13. Miért nem számolunk SSD-n fejmozgatási és forgási várakozási időt?

Az SSD-ben nincs mozgó olvasófej és forgó lemez. A lapelérések és adatátvitel költsége azonban ott is létezik; a HDD mechanikai magyarázatát nem visszük át szó szerint az SSD-re.

14. Az eszköz_id szerint fizikailag rendezett adatok SELECT eredménye mindig id szerint rendezett?

Nem. A lekérdezés más hozzáférési útvonalat is használhat, és SQL-eredménysorrend csak megfelelő ORDER BY esetén garantált. A fizikai szervezés nem helyettesíti ezt.

Önálló feladat: válassz hozzáférési szerkezetet!

A kölcsönző 120 000 eszközt tart nyilván. A szemléltető adattárolásban 40 rekord fér egy lapra. Naponta sok egyedi id-keresést végzünk, gyakran kérjük az id-k egy intervallumát, néha egy ritka eszközkategóriát, és tömeges beszúrás is előfordul. A kategóriák közül a laptop a rekordok 70%-a, a drón 1%-a. Kezdetben üres pufferrel számolj, és az index belső lapjainak olvasását külön kezeld.

  1. Számítsd ki az adatlapok számát és egy teljes bejárás egyszerű olvasási költségét!
  2. Hasonlítsd össze a fa- és hash-hozzáférést az id-keresésekhez!
  3. Adj indokolt megoldást a drón és a laptop kategória lekérdezésére!
  4. Sorold fel, mit kell karbantartani egy kategóriaváltozáskor!
Részletes mintamegoldás és indoklás
  1. Az adatlapok száma ⌈120 000/40⌉ = 3000. A teljes bejárás ebben a modellben 3000 adatlapot kér. Puffer, előolvasás, tömörítés és más megvalósítási részlet nélkül ez a szemléltető hideg olvasásszám.
  2. Az id szerinti B+ fa pontos kereséshez és tartományhoz is használható. A hash egyedi egyezéshez jó jelölt lehet, de az intervallumokat nem támogatja a kulcssorrend megtartásával. Ha egy szerkezetet választunk a két gyakori igényhez, a rendezett faindex kézenfekvő; a konkrét kezelő képességeit és mérést is figyelembe vesszük.
  3. Drón: 1200 rekord, ezért a kategóriaindex hasznos jelölt. Az érintett lapok száma nem számolható ki pusztán 1200/40-ből, ha a rekordok szétszórtan helyezkednek el: szélső esetben minden találat külön lapon is lehet. Laptop: 84 000 rekord, így a teljes bejárás versenyképes lehet. Csoportos elhelyezés más lapköltséget adna; végrehajtási tervvel és méréssel ellenőrzünk.
  4. A rekord új kategóriát kap, és a kategóriaindex régi bejegyzéséből el kell távolítani, az új kategóriához hozzá kell rendelni. Ha a kategória a fizikai csoportosítás része, a megfelelő csoportba való áthelyezés is szükséges lehet. Az adatbázis-kezelő tartja összhangban a rekordot és a hozzáférési szerkezeteket.

Ha külön tudod választani a logikai adatot a fizikai tárolástól, meg tudod indokolni az index választását, és követni tudod a keresés útját, a belső szint alapjait már használni is tudod.