Indexek, nézetek, tárolt programok a relációs adatbázisban

r

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

r

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

r

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

r

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?

r

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

r

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

r

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?

r

Index létrehozásra példa: https://www.tutorialspoint.com/sql/sql-indexes.htm

Automatikusan

r

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

r

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

a

Milyen típusai vannak?

Nincsenek szabványok

r

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

r

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

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

Példa

Alapvető tulajdonságai

r

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ú

r

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

a

Bittérképes

r

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

Példa

Alapvető tulajdonságai

r

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

r

Különböző szakterületeken, különböző megoldások születhetnek.

Nézet

Miért kell a nézet?

r

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

r

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?

r

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

r

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?

r

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

r

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?

r

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

r

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

r

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

r

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

r

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

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

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

r

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)

r

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.