Indexek, nézetek, tárolt programok a relációs adatbázisban
Készítette: Erdélyi Dániel2017.03.21.-i Corvinusos Adatbázis-rendszerek előadás, azon készített jegyzeteim és külső források segítségével
Index
speciális, belső adatszerkezetgyakran használt objektum a relációs adatbázisbanáltalában a táblához van hozzárendelve, de attól függetlenül van tárolva (külön is létre lehet hozni)független --> több index létrehozása is lehetséges 1 adattábláhoza "fizikai adatbázis része"fizikai adatbázis felépítése: https://technet.microsoft.com/en-us/library/ms179276(v=sql.90).aspxlogikailag összefügg a táblákkal, de fizikailag külön tárolódik
Miért kell az index?
Adatintegritási szabály ellenőrzése
adatintegritásra példa: nem lehet két azonos érték egy azonosító oszlop 2 különböző mezőjébenha megadott értékek szerepelhetnek csak az adott oszlopban, nem lehet azokon kívül mást beleírni Forrás: https://technet.microsoft.com/en-us/library/ms184276(v=sql.105).aspxprimary key/unique kényszer biztosítása, kikényszerítéseCREATE... utasításnál index is létrejön (jellemzően azonnal)példa: van egy táblánk 1millió sorral és 1 új sort szeretnénk hozzáadniaz elsődleges kulcs értéke nem egyezhet semelyik sorbanminél gyorsabban le kell ellenőrizni az összes sort, hogy az adatbázis gyorsabban frissüljön
Hatékonyságnövelés
lekérdezések felgyorsításaindex mentén keresésaz adott kulcson keresztül tudjuk megtalálni az adatotgyorsabb, mintha minden rekordon végigmegyünk+ nem kell rendezninem mindig lehetségesfizikailag a lemez más sorrendben olvassa be a sorokat, mint ami logikailag jobb döntés lenneaz index módosítás 3x-osan lassíthat egy beszúrást (1 sor: 1ms helyett 3ms)nem-egyedi index használatalehet az index csak lassító tényező --> ignorálható
Milyen csoportosításai vannak?
Ez a két csoportosítás típus nem zárja ki egymást, tehát mind a 4 fajta index létrehozható:egyoszlopos és egyediegyoszlopos, de nem-egyeditöbboszlopos és egyeditöbboszlopos, de nem-egyedi
Egyoszlopos/többoszlopos
ha a tábla kulcsa egyoszlopos: 1 oszlopra épül az index is (egyoszlopos)ha a tábla kulcsa többoszlopos: több mezőt is meg lehet adni (többoszlopos index)másképp: "konkatenált" vagy összetett index
Egyedi/nem-egyedi
egyedi index: olyan index, ami a primary key vagy unique kényszer hatására jön létre automatikusanelvileg létrehozható kényszer nélkül is, de nem ajánlott!nem-egyedi index:nem a felhasználói hatáskör része általábanaz adatmodell készítője tervezi meg, hozza létre(vagy rendszergazda, fejlesztő)((ha késztermékről van szó))
Hogyan hozunk létre indexet?
Index létrehozásra példa: https://www.tutorialspoint.com/sql/sql-indexes.htm
Automatikusan
Az egyedi indexek jönnek létre automatikusan, amikor primary key vagy unique kényszert hozunk létre. Jellemzően ez a folyamat azonnal megtörténik.DML utasítások automatikusan módosíthatjáknem mindig! - adatbáziskezelők a korai fázisukban nem feltétlenül implementálják ezt a funkciótTörlése: automatikusan törlődik, ha a kényszert eldobjuk/kikapcsoljukkülön nem is engedi a rendszer, hogy eldobjuk explicit módon
Explicit
ha explicit (sql utasítással) hozzuk létre:CREATE [UNIQUE] [CLUSTERED] [NONCLUSTERED] INDEX indexnév ON {táblanév | nézet} (oszlopnév [ASC | DESC] [, . . .n]) [WITH [PAD_INDEX] [[,] FILLFACTOR = feltöltési_tényező] [[,] IGNORE_DUP_KEY] [[,] SORTED_DATA] [[,] SORTED_DATA_REORG] [[,] DROP_EXISTING] [[,] STATISTICS_NORECOMPUTE] [ON fájlcsoport] Oracle dokumentációban ábrázolva: https://docs.oracle.com/database/121/SQLRF/img/create_index.gifforrás: http://softwareonline.animare.hu/cikk.aspx?id=3638ha explicit töröljük:DROP INDEX indexnév;Oracle dokumentációban ábrázolva: https://docs.oracle.com/database/121/SQLRF/img/drop_index.gif
aMilyen típusai vannak?
Nincsenek szabványok
Az adatbáziskezelő rendszereket fejlesztő cégek egymástól veszik át az ötleteket (~ lopás) --> másik cég perel --> peren kívüli megegyezés ("stratégiai együttműködés")Főképp a praktikusság miatt léteznek hasonló típusok!
B-fa+variációi
Különböző variációi léteznek, a fentebb említett szabványok hiánya miatt. Ilyen például a B* és a B+. Legfőképp az elsődleges kulcsok indexeinél használják, illetve OLTP típusú rendszerekben.forrás: https://docs.oracle.com/cd/E11882_01/server.112/e40540/indexiot.htm#CNCPT721
Szerkezete
Részei:gyökér blokk: az alsóbb rétegbe mutatnak az indexadatokközbülső csomópont: több réteg is lehet, ami alapján kapjuk meg a B-fa magasságát (n+2, ahol n a csomópontok száma)levél blokk: itt vannak tárolva az indexértékekkulcsértékekmutatók: Oracle-ben a rowid - egyedi sorazonosítóForrás az Oracle dokumentációból, amiben a B-fa indexeléssel kapcsolatban olvashatunk magyarázatot illetve, példát: https://docs.oracle.com/cd/E11882_01/server.112/e40540/indexiot.htm#CNCPT1170
Példa
Alapvető tulajdonságai
B = balanced = minden irányban ugyanannyi lépés van a gyökértől a levéligaz index szerkezete szerteágazó, terebélyessorszinten záródik = több ember is tud egyszerre szerkeszteniemiatt is használható jól OLTP rendszerekben, ahol ez egy fontos szempont a több felhasználó miattnehéz updatelni az indexelt oszlopokatkülönösen, ha az oszlopértéke változikaz INSERT utasítás alatt is az index frissítése a hosszadalmasabb folyamat, nem az új adat bevitele
Függvényalapú
Olyan függvényeredményeket tárolunk az indexben, amik tartalmaznak legalább egy oszlopot az indexelt táblából."A függvény maga lehet aritmetikai kifejezés, vagy olyan kifejezés, ami tartalmaz PL/SQL függvényt, csomag függvényt, C hívást vagy SQL függvényt. Nem tartalmazhat azonban aggregátum függvényeket, DETERMINISTIC-usnak kell lennie, s nem vonatkozhat LOB típusú, REF vagy beágyazott tábla oszlopára sem."forrás: http://oraoptimization.blogspot.hu/2008/03/architektra-part-4-sma-objektumok-22.html
aBittérképes
Olyan rendszerek esetében hasznos, ahol egyszerre kevés felhasználónak van jogosultsága a szerkesztéshez. Színek tárolására is alkalmas.Eredeti gyártó: teradata, mások továbbvettékEgy összehasonlítása a B-fa típusú indexeléssel: http://www.oracle.com/technetwork/articles/sharma-indexes-093638.html
Példa
Alapvető tulajdonságai
Képes színeket tárolni, bináris kód segítségévelminden cellára megvan határozva egy 0-1 érték, hogy a fő színek közül van-e benne olyana sorok számától függ a hosszaezenkívül rendelkezik egy rowid értékkel, ami mindig megegyezikpl. gépjárművek színének tárolása egy rendőrségi adatbázisban, max. 100 szín ---> 100 bitvektorpl. térképészet, térinformatikanem sorszinten záródikadattárházakban használhatóbb - felgyorsítja a SELECT utasítástnehéz karbantartani folyamatosanbitvektorok tömörítettekOR feltételek hasznosakújraindexelés lehetséges
Egyéb megoldások
Különböző szakterületeken, különböző megoldások születhetnek.
Nézet
Miért kell a nézet?
A lekérdezések megírásának felgyorsítására használják, a lekérdező munkáját könnyíti meg.Bonyolult lekérdezések helyett, eltárolunk kisebb lekérdezéseket, névvel látjuk el, és később behivatkozhatjuk, így megkönnyítve annak a szerkesztését, illetve kiszámítását.
Alapvető tulajdonságok
A nézet nem tárol adatot! Csak az eredményt létrehozandó lekérdezést (definíciót).A nézet egy meta-adat (olyan adat, ami más adatról ad információt)forrás: https://techterms.com/definition/metadataElsősorban a lekérdező munkáját könnyíti megLehet jogosultságkezelési céljaNincs nagy helyigénye (fizikailag)A DML műveletek nem mindig megengedettek nézeteken keresztül
Hogyan hozunk létre nézetet?
explicit módon: (példa)CREATE VIEW nézetnév ASSELECT oszlop1, oszlop2FROM oszlopokWHERE oszlop1 is not null;Oracle dokumentációban ábrázolva: https://docs.oracle.com/database/121/SQLRF/img/create_view.gifKésőbb lekérdezhetünk a nézetből: (példa)SELECT oszlop1, oszlop2, oszlop3FROM nézetnévWHERE oszlop2 is null;
Materializált nézet
Az egyszerű nézet és a tábla tulajdonságait vegyítiEgy mester tábla/nézet replikációja, amit egy adott időpontban hoztak létrebármikor lehet frissíteni, szükség eseténhosszú időt vehet igénybeinternethez nem mindig kapcsolódó, illetve offline adatbázisok esetében hasznos lehet az alkalmazásukTovábbi információ a materializált nézetről:http://docs.oracle.com/cd/B10500_01/server.920/a96567/repmview.htm
Trigger
Miért kell a trigger?
A kényszerek nem tudnak minden problémára megoldást nyújtani.Például:ugyanazon táblában lévő cellák összehasonlításajelenbeli dátum (sysdate) használata gondot okozhatadatérvényesség biztosítása máshogyProgramkód segítségével lehet ezt megoldani. -->procedurális kód
Procedurális kód
Az adatbázison belül tárolhatunk függvényeket, amelyek segítenek feldolgozni az adatokat.Ezeket a metódusok programkódok, amiket oszlopokban (attribútumokban, az objektumorientált programozás szerint) tárolhatunk.Egy procedurális kódhoz, szükség van egy programnyelvre is:az SQL nem procedurálisJavaOracle esetében: PL/SQLeljárásokat, függvényeket, csomagokat (package), objektumorientált metódusokat és adatbázis triggereket írhatunkEnnek hatására az Oracle adatbáziskezelő rendszer több procedurális nyelvet is érti, és képes futtatni.
Hogyan hozhatunk létre trigger-t?
CREATE TRIGGER ... utasítással, programkód segítségévelOracle dokumentációban ábrázolva: https://docs.oracle.com/database/121/SQLRF/img/create_trigger.gif
Példa
Példa: ebben az esetben megadunk előre egy default (alapértelmezett) értéket az újonnan bevitt telefonszámokra, hogy egyezzen a munkatelefonszámmal, ha nincs kitöltveCREATE TRIGGER Clients_Insert BEFORE INSERT ON Clients REFERENCING NEW ROW AS New FOR EACH ROW SET New.home_telephone = COALESCE(New.home_telephone,New.work_telephone); forrás: https://mariadb.com/kb/en/sql-99/trigger-examples/
Egyéb objektumok
Szinoníma
A behivatkozott Oracle dokumentációban vannak leírva a "szinoníma" használati lehetőségei, előnyei, illetve általános felépítése. Ezeken kívül a legvégén példával demonstrálja a "szinoníma" gyakorlati használatának lehetőségét.
Adatbázis link
A behivatkozott Oracle dokumentációban vannak leírva az "adatbázis link" használati lehetőségei, előnyei, illetve általános felépítése. Ezeken kívül a legvégén példával demonstrálja az "adatbázis link" gyakorlati használatának lehetőségét.
Kontextus
A behivatkozott Oracle dokumentációban vannak leírva a "kontextus" használati lehetőségei, előnyei, illetve általános felépítése. Ezeken kívül a legvégén példával demonstrálja a "kontextus" gyakorlati használatának lehetőségét.
Jogosultság, szerepkör
A behivatkozott Oracle dokumentációban vannak leírva a "jogosultság" használati lehetőségei, előnyei, illetve általános felépítése. Ezeken kívül a legvégén példával demonstrálja a "jogosultság" gyakorlati használatának lehetőségét.
Könyvtár
A behivatkozott Oracle dokumentációban vannak leírva a "könyvtár" használati lehetőségei, előnyei, illetve általános felépítése. Ezeken kívül a legvégén példával demonstrálja a "könyvtár" gyakorlati használatának lehetőségét.
Profil
A behivatkozott Oracle dokumentációban vannak leírva a "profil" használati lehetőségei, előnyei, illetve általános felépítése. Ezeken kívül a legvégén példával demonstrálja a "profil" gyakorlati használatának lehetőségét.
Sorozat (sequence)
A behivatkozott Oracle dokumentációban vannak leírva a "sorozat" használati lehetőségei, előnyei, illetve általános felépítése. Ezeken kívül a legvégén példával demonstrálja a "sorozat" gyakorlati használatának lehetőségét.