Az adatbázisoknál a clustered indexelés esetén az adatok, hogy vannak fizikailag tárolva?
Tegyük fel, hogy van egy adatbázisom személyekkel és mindegyik személynek van egy id-ja ami szerint felépítettük az indexeket és eltároltuk az adatokat a háttértárolón. A clustered index biztosítja, hogy az adatok növekvő sorrenben vannak eltárolva fizikailag.
Pl:
id Nev
---------
12 Jancsi
18 Gyuri
19 Peti
32 Mari
45 Juli
Természetesen egy adatbázisban jóval több adat van. Na mostmár ha be akarom szúrni Katit 5-ös id-val akkor elméletileg az kell legyen az első ami maga után vonja, hogy mindegyik eddig bejegyzett személy eltolódik egyel. Ez öt név esetén tényleg nem nagy dolog de millió név esetén eléggé időigényes lehet.
A kérdésem pedig, hogy a létező adatbázis kezelő szoftverek, hogyan oldják meg ezt?
Szerintem nem érted a clustered index (CI) jelentését. A CI az adat fizikai helyét jeleni és nincs köze az indexhez.
1|1|Aba
2|2|Béla
3|3|Cecil
Itt (CI|ID|Név) még egybe esik a CI és az index, ha töröljük Bélát, akkor mi történik?
1|1|Aba
2| |
3|3|Cecil
Keletkezik egy lyuk. Egyik adatbázi kezelő sem fogja átmozgatni az adatokat, hogy a lyukat betöltse, otthagyja. Jön egy új adat, 4-es ID-vel Dénes.
Ekkor az adatbázis kezelő valamilyen algoritmus (ami lehet egy beállítás is), hogy mit csinál:
A.)
1|1|Aba
2| |
3|3|Cecil
4|4|Dénes
B.)
1|1|Aba
2|4|Dénes
3|3|Cecil
Mindkét megoldásnak vannak előnyei. Az A.) gyorsabb, mert a CI szerinti utolsó helyre kell csak szúrni az adatot, nem kell keresgetni a lyukat, viszont a tábla mérete így 4, holott csak 3 adat tárolódik benne, ami viszont az A hátrányát adja.
A CI-t te nem tudod birizgálni közvetlenül.
Talán nem itt tévedek?
Az adatok data page-ekre vannak osztva. A növekvő sorrend csak egy adott data page-en belül érvényes? Ezek a data page-ek bárhol lehetnek a háttértárolón...ami azt jelenti, hogy beszúráskor a többi data page után beszúr egy új page-et amibe bemásolja az új adatot.
Pl:
A háttértárolón:
Page1:
1. 12 Mari
2. 15 Gyuri
3 16 Peti
Page2:
1. 18 Kati
2 19 Feri
3 31 Attila
Ha be akarom szúrni mondjuk 13-al Pistát akkor létrehoz egy page3-at és azt a page 2 után helyezi el:
Page1:
1. 12 Mari
2. 15 Gyuri
3 üres
Page2:
1. 18 Kati
2 19 Feri
3 31 Attila
Page3:
1. 13 Pista
2. 16 Peti
3. üres
A clustered indexelés arról szól hogy kiválasztasz oszlopokat ami alapján B keresőfát építesz és fizikailag rendezve tárolod a sorokat. A B fa minden levele egy lap, a lapokon belül pedig a sorok rendezve vannak.
2 fajta töredezettséget különítünk el:
- Ha új lapokat kell beszúrni és fizikailag az új lapok nem férnek be a másik kettő közé akkor azt a legközelebbi üres helyre írja, ami miatt a lapok nem lesznek sorrendben. (külső töredezettség)
- Amikor egy adatot beszúrunk, akkor az új lapok létrehozásakor a lapokban üres hely keletkezhet. (belső töredezettség)
A töredezettség lassítja az olvasást és feleslegesen növelheti az adatbázis méretét. Egyrészről karbantartási napokon az adatbázison le szokás futtatni töredezettség mentesítést, másrészről pedig memóriába vagy SSD-be szokás cache-elni az adatbázist vagy legalább a gyakran használt adatokat, mert ha a cache-ben történik a töredezettség az nem fogja lassítani a olvasást.
Ebből adódik hogy olyan adatbázisoknál szokás használni a clustered indexelést, ahol vagy nem módosítjuk az adatbázist, vagy amikor igen akkor kizárólag az növelve a index-kulcsot.
A tudsz figyelni arra hogy ne töredezedjen nagy méretékben az adatbázis akkor sokkal gyorsabb tud lenni mint a non-clustered indexelés, viszont ha nagyon töredezik akkor lassabb lesz és nem éri meg a használata.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!