Clusterek ========= Kicsit ellentétes filozófiát képvisel, mint a normalizálás. Pl. Vannak Osztályok és Dolgozók Normalizálva: Osztály(okod, nev, telephely, ...) Dolgozo(dkod, okod, nev, ...) Nagy táblák esetén ezzel az a baj, hogy nagyon szét vannak szórva az adatok. Ha például a 10-es kódú osztály dolgozóiról akarok információkat, akkor rengeteget kell olvasgatni a lemezről. Ami jó lenne: legyenek együtt tárolva az egyes osztály dolgozói Erre jó a cluster: több táblát fizikailag egy egységként (egy szegmensben) tárol. Mi kell ahhoz, hogy használhassunk cluster-eket? Legyen egy vagy több közös oszlopa a tábláknak. Közös oszlop: az oszlopok típusa kell, hogy megegyezzen (a név mindegy) A clusterek esetén megint nem igaz, hogy egy tábla egy szegmens, hanem: Egy cluster = egy szegmens Cluster létrehozása: CREATE CLUSTER Meg kell adni a kulcsát, kulcsait is. Utána majd ehhez kell kapcsolni a táblák "közös" oszlopait. CREATE CLUSTER personnel ( department_number NUMBER(2) ) SIZE 512 STORAGE (INITIAL 100K NEXT 50K); A cluster is egy szegmens, és így megadhatók a tárolásával kapcsolatos paraméterek. TABLESPACE, STORAGE (...) stb. Táblák feltevése a clusterre: CREATE TABLE emp_cls ( empno NUMBER PRIMARY KEY, ... , deptno NUMBER(2) NOT NULL) CLUSTER personnel (deptno) CREATE TABLE dept_cls ( deptno NUMBER(2), dname VARCHAR2(9), loc VARCHAR2(9)) CLUSTER personnel (deptno) Érdekességek: ============= A cluster kulcs csak egyszer tárolódik Akkor jó igazán, ha egyenlőséges feltételt használok lekérdezésnél, és nem az összes osztály információ kell, hanem csak néhány. Például csak a 10-es és 20-as osztályokról akarok infót. Nyílván ez csak akkor lehet hatékony, ha gyorsan el tudok érni egy részt a clusterből |10 osztály sor | | dolgozó sor | | dolgozó sor | | dolgozó sor | |20 osztály sor | | dolgozó sor | | dolgozó sor | |30 osztály sor | | dolgozó sor | stb. Hogyan lehet gyorsan keresni a clusterben? ========================================== Kell valamilyen segédstruktúra. Szó szerint KELL, amíg nem csinálok egy ilyet, nem is enged beszúrni a clusterbe sorokat. Ez a segédstruktúra lehet index, vagy hash táblázat. Index cluster ============= Úgy működik, ahogy ezt már láttuk Csak a cluster kulcsra lehet létrehozni az indexet, azaz nem is kell megadni az indexnél az oszlopot, amire az indexet létrehozom. CREATE INDEX idx_personnel ON CLUSTER personnel; Csak az index létrehozása után enged sorokat beszúrni a táblákba!!! Hash cluster ============ Egy hash függvény által visszaadott érték alapján helyezi el a kulcsértékeket. Előre meg kell adnom, hogy hány hash érték lesz. CREATE CLUSTER personnel1 ( department_number NUMBER ) SIZE 512 HASHKEYS 500 STORAGE (INITIAL 100K NEXT 50K); Vagyis a cluster létrehozásánál kell megadni, hogy hash clustert csináljon. Ha nem adjuk meg a HASHKEYS-t, akkor index clustert készít. Érdekesség: hiába adtam meg 500-at, valójában a következő prímszámot (503) fogja beállítani. (A hash fv működése miatt) De megadhatok saját hash fv-t is: CREATE CLUSTER personnel2 ( home_area_code NUMBER, home_prefix NUMBER ) HASHKEYS 20 HASH IS MOD(home_area_code + home_prefix, 101); Ez azért jó, mert így elvileg szabályozhatom, hogy hova kerüljenek az egyes sorok. Az azonos hash értékű sorok fizikailag ugyanoda kerülnek. Például van két táblám és azt akarom, hogy ezeknek bizonyos sorai egy blokkba kerüljenek. Megoldás: saját hash fv-t csinálok, mondjuk egy ilyet: HASH IS MOD(kulcs, 11) és az egyes soroknak olyan cluster kulcs értéket adok, amik mod 11 megegyeznek. Az elhelyezkedést utólag ellenőrizhetem ha megnézem a sorok ROWID-jét. Tárolási paraméterek: ===================== SIZE Megadható, hogy az azonos klaszter kulcs értékkel rendelkező sorok számára mekkora helyet foglaljon le az oracle. Megadása valójában csak akkor fontos, ha azt szeretnénk, hogy egy blokkban több különböző klaszter kulccsal rendelkező sor is tárolódjon. Ha nem adjuk meg, vagy a mérete nagyobb a blokkméretnél, akkor az oracle minden klaszter kulcsot különböző blokkba tesz. SINGLE TABLE Egyetlen táblát tartalmazó hash klaszter létrehozása. Ez arra jó, hogy egy olyan táblát tudjunk létrehozni, amelynek a fizikai tárolása hash alapú elérést tesz lehetővé. CREATE CLUSTER personnel3 (deptno NUMBER) SIZE 512 SINGLE TABLE HASHKEYS 500; Clusterekkel kapcsolatos katalógusok: ===================================== DBA_CLUSTERS DBA_TABLES (cluster_name oszlop -> melyik klaszteren van a tábla) DBA_CLU_COLUMNS (táblák oszlopainak megfeleltetése a klaszter kulcsának) DBA_CLUSTER_HASH_EXPRESSIONS (hash klaszterek hash függvényei)