01 · Belső szint
Mit tervezünk a belső szinten?
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.
| Szint | Példakérdés | Példaválasz |
|---|---|---|
| Külső | Mit láthat a kölcsönző tanuló? | A szabad eszközök neve és elérhetősége. |
| Logikai | Milyen 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?
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.
| Fogalom | Jelentés | Mire figyelünk? |
|---|---|---|
| Lemezfelület | Egy tárolólemez adatot hordozó felülete. | A fej a megfelelő felületet éri el. |
| Sáv | Kör alakú adattárolási pálya. | A fej megfelelő sugárra áll. |
| Cilinder | Azonos sugarú sávok együttese. | Klasszikus lemezgeometriai fogalom. |
| Szektor | A 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.
- A szemléltető összeg 4 + 3 + 1 = 8 ms.
- Tíz külön, pufferből ki nem szolgálható véletlen olvasás ebben a leegyszerűsített modellben 80 ms.
- 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
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.
- Használható terület: 4096 − 96 = 4000 bájt.
- Rekord/lap: ⌊4000 / 200⌋ = 20.
- Szükséges lapszám: ⌈95 / 20⌉ = 5.
- 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.
| Helyzet | Logikai lapkérés | Új háttértár-olvasás |
|---|---|---|
| A kért lap nincs a pufferben | 1 | 1 |
| Ugyanazt a lapot újra kérjük, és még bent van | 1 | 0 |
| A lap időközben kiszorult | 1 | 1 |
04 · Belső szint
Rendezetlen és rendezett állomány
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.
| Lap | Heap állomány: id-k | Id szerint rendezett állomány: id-k |
|---|---|---|
| B1 | 140, 102, 170 | 102, 107, 111 |
| B2 | 107, 155, 118 | 118, 125, 132 |
| B3 | 183, 111, 147 | 140, 147, 155 |
| B4 | 132, 125, 162 | 162, 170, 183 |
Kidolgozott példa · Az új 120-as eszköz
A rendezett példában 118 és 125 közé új rekord érkezik.
- A megfelelő logikai hely a B2 környezetében van.
- Ha a lapban van szabad hely, oda kerülhet.
- 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
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.
- Lineárisan B1, B2, B3 kerül sorra: 3 adatlapot kérünk.
- Binárisan B2, majd B3 kerül sorra: 2 adatlapot kérünk.
- A B3 belsejében a 147-es rekordot is ellenőrizni kell.
- 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
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.
| Az adatlap első id-je | Adatlap |
|---|---|
| 102 | B1 |
| 118 | B2 |
| 140 | B3 |
| 162 | B4 |
Kidolgozott példa · Két közeli keresés
147-et, majd 150-et keresünk ugyanebben a rendezett állományban.
- Mindkét kulcshoz a 140-es kezdőbejegyzést választjuk, tehát B3 a lehetséges lap.
- 147 a lapon szerepel: találat.
- 150 nem szerepel: nincs találat.
- 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
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.
| eszköz_id | kategória | hely |
|---|---|---|
| 102 | kamera | B1:r1 |
| 107 | laptop | B1:r2 |
| 111 | tablet | B1:r3 |
| 118 | kamera | B2:r1 |
| 125 | laptop | B2:r2 |
| 132 | tablet | B2:r3 |
| 140 | laptop | B3:r1 |
| 147 | laptop | B3:r2 |
| 155 | tablet | B3:r3 |
| 162 | kamera | B4:r1 |
| 170 | laptop | B4:r2 |
| 183 | tablet | B4:r3 |
| Keresési érték | A hozzá tartozó összes rekordhely |
|---|---|
| kamera | B1:r1, B2:r1, B4:r1 |
| laptop | B1:r2, B2:r2, B3:r1, B3:r2, B4:r2 |
| tablet | B1: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.
- A másodlagos indexben megkeressük a kamera bejegyzést.
- A helylista 3 rekordra, összesen 3 külön adatlapra vezet.
- A már pufferben lévő lapot nem kell újra háttértárból olvasni.
- 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
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.
| Lap | Kategória | Eszközök |
|---|---|---|
| G1 | kamera | 102, 118, 162 |
| G2 | laptop | 107, 125, 140 |
| G3 | laptop | 147, 170 |
| G4 | tablet | 111, 132, 155 |
| G5 | tablet | 183 |
Kidolgozott példa · Kamerák és laptopok
A szemléltető lapok legfeljebb 3 rekordot tartalmaznak.
- A 3 kamera egyetlen csoportlapban található.
- Az 5 laptop két egymás utáni csoportlapot igényel.
- 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
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.
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.
- Üres pufferrel a lehetséges olvasások száma 3 + 1 = 4.
- Ha a gyökér és belső lap már pufferben van, két új olvasás is elegendő lehet.
- Ha a levél maga tárolja a teljes rekordot, nincs külön adatlap-hozzáférés.
- 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
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.
| Eszköz-id K | Számítás | Vödör |
|---|---|---|
| 103 | 103 = 14·7 + 5 | 5 |
| 110 | 110 = 15·7 + 5 | 5 |
| 117 | 117 = 16·7 + 5 | 5 |
| 125 | 125 = 17·7 + 6 | 6 |
| 134 | 134 = 19·7 + 1 | 1 |
| 142 | 142 = 20·7 + 2 | 2 |
Kidolgozott példa · A 117-es id keresése
Az 5-ös vödörben 103, 110 és 117 található.
- Kiszámítjuk: 117 mod 7 = 5.
- Az 5-ös vödröt kérjük, és ellenőrizzük az eredeti kulcsokat.
- 103 és 110 nem egyenlő a keresett kulccsal; 117 igen.
- 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
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.
| Címtár utolsó 2 bit alapján | Vödör | Tárolt kulcsok |
|---|---|---|
| 00 | V_páros | 2, 4 |
| 01 | V_01 | 5 |
| 10 | V_páros | 2, 4 |
| 11 | V_11 | 3, 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.
- Binárisan: 3 = 11, 7 = 111, 5 = 101.
- A két utolsó bit: 11, 11, illetve 01.
- Az új 01-es vödörbe 5 kerül, a 11-esbe 3 és 7.
- 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
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.
| Igény | Kedvező lehet | Mire figyelünk? |
|---|---|---|
| Egy eszköz egyedi id alapján | Faindex vagy hash-hozzáférés | A konkrét kezelő által támogatott szerkezet. |
| 125 és 162 közötti id-k | Rendezett faindex | Az alsó határ után levéllánc-bejárás. |
| Az összes kamera | Kategória szerinti másodlagos index | Az összes találat és érintett adatlap. |
| Majdnem minden eszköz listája | Teljes állománybejárás | Az indexhez képest a teljes költség lehet kisebb. |
| Sok beszúrás, kevés keresés | Visszafogott indexszám | Minden 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.
- Számítsd ki az adatlapok számát és egy teljes bejárás egyszerű olvasási költségét!
- Hasonlítsd össze a fa- és hash-hozzáférést az id-keresésekhez!
- Adj indokolt megoldást a drón és a laptop kategória lekérdezésére!
- Sorold fel, mit kell karbantartani egy kategóriaváltozáskor!
Részletes mintamegoldás és indoklás
- 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.
- 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.
- 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.
- 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.