5
1 8. fejezet Nézetek és indexek Ezt a fejezetet a nézettáblák ismertetésével kezdjük. A nézettábla olyan relá- ció, melyet más relációkra vonatkozó lekérdezésekkel definiálunk. A nézettáblák az adatbázisban nincsenek tárolva, de ugyanúgy lekérdezhetok, mintha létezo táblák lennének. A nézettáblára vonatkozó lekérdezés végrehajtásakor a lekér- dezésfeldolgozó a nézettábla definícióját felhasználva látszólagosan eloállítja a nézettáblát. A nézettáblák tárolhatók is abban az értelemben, hogy az adatbázisból pe- riodikusan eloállíthatók és tárolhatók is. A tárolt nézettáblákkal a lekérdezések végrehajtási sebessége növelheto. A tárolt nézet táblák nagyon fontos speciá- lis típusa az index, ami olyan tárolt adatstruktúra, amelynek egyedüli célja a tárolt relációk meghatározott sorai elérésének felgyorsítása. E fejezetben be fog- juk mutatni az indexeket, és áttekintjük a tárolt táblákhoz a megfelelo index kiválasztásának legfontosabb kérdéseit. 8.1. Nézettáblák ACREATETABLE utasítással definiált táblák fizikailagléteznek az adatbázisban, azaz az adatbázisrendszer valamilyen fizikai struktúrában tárolja oket. Megtart- ják az állapotukat, azaz nem változnak addig, amíg valamilyen táblamódosító SQL-utasítás meg nem változtatja oket. Létezik az SQL-relációknak egy másik típusa, amit nézettáblának nevezünk, amelyek nem léteznek fizikailag az adatbázisban. A nézettáblákat a lekérdezés- hez hasonló kifejezés segítségével definiáljuk. A nézettáblákat ugyanúgy lekér- dezhetjük, mint a fizikailag létezo táblákat, és egyes esetekben még módosíthat- juk is oket. ~.. . lk

Nézetek és indexek - ELTE (nezettablak).pdfciók, azaz a "táblák" és a virtuális relációk, a ,,nézettáblák" között. Most, hogy már ismerjük a különbséget a tábla

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Nézetek és indexek - ELTE (nezettablak).pdfciók, azaz a "táblák" és a virtuális relációk, a ,,nézettáblák" között. Most, hogy már ismerjük a különbséget a tábla

1

8. fejezet

Nézetek és indexek

Ezt a fejezetet a nézettáblák ismertetésével kezdjük. A nézettábla olyan relá-ció, melyet más relációkra vonatkozó lekérdezésekkel definiálunk. A nézettáblákaz adatbázisban nincsenek tárolva, de ugyanúgy lekérdezhetok, mintha létezotáblák lennének. A nézettáblára vonatkozó lekérdezés végrehajtásakor a lekér-dezésfeldolgozó a nézettábla definícióját felhasználva látszólagosan eloállítja anézettáblát.

A nézettáblák tárolhatók is abban az értelemben, hogy az adatbázisból pe-riodikusan eloállíthatók és tárolhatók is. A tárolt nézettáblákkal a lekérdezések

végrehajtási sebessége növelheto. A tárolt nézet táblák nagyon fontos speciá-lis típusa az index, ami olyan tárolt adatstruktúra, amelynek egyedüli célja atárolt relációk meghatározott sorai elérésének felgyorsítása. E fejezetben be fog-juk mutatni az indexeket, és áttekintjük a tárolt táblákhoz a megfelelo indexkiválasztásának legfontosabb kérdéseit.

8.1. Nézettáblák

A CREATETABLEutasítással definiált táblák fizikailagléteznekaz adatbázisban,azaz az adatbázisrendszer valamilyen fizikai struktúrában tárolja oket. Megtart-ják az állapotukat, azaz nem változnak addig, amíg valamilyen táblamódosítóSQL-utasítás meg nem változtatja oket.

Létezik az SQL-relációknak egy másik típusa, amit nézettáblának nevezünk,amelyek nem léteznek fizikailag az adatbázisban. A nézettáblákat a lekérdezés-hez hasonló kifejezés segítségével definiáljuk. A nézettáblákat ugyanúgy lekér-dezhetjük, mint a fizikailag létezo táblákat, és egyes esetekben még módosíthat-juk is oket.

~...lk

Page 2: Nézetek és indexek - ELTE (nezettablak).pdfciók, azaz a "táblák" és a virtuális relációk, a ,,nézettáblák" között. Most, hogy már ismerjük a különbséget a tábla

~8. Nézetek és indexek táb lák

8.1. Nézet

A nézettábla definíciója:

CREATE VIEW FilmProducer ASSELECT Filmek.filmcím, név

FROM Filmek, GyártásIrányító

WHERE producerAzon = azonosító;

Fenti definíció két relációt kapcsol össze és az azonosítók egyezését követeli meg.A film címét és a producer nevét a megegyezo azonosítójú sorpárokból állítjae16. O

362

Relációk, táblák és nézettáblák

Az SQL-programozók gyakran használják a "tábla" szót a ,,reláció" szóhelyett. Az ok abban rejlik, hogy fontos különbséget tenni a tárolt relá-ciók, azaz a "táblák" és a virtuális relációk, a ,,nézettáblák" között. Most,hogy már ismerjük a különbséget a tábla és a nézettábla között, a ,,relá-ció" megnevezést csak ott fogjuk használni, ahol a táblát és a nézettáblátis használhatnánk. Amikor hangsúlyozni akarjuk, hogy egy reláció tárolt,akkor az "alapreláció" vagy "alaptábla" kifejezéseket fogjuk használni.

Létezik egy harmadik típusú reláció is, amely nem nézettábla és nincsfizikailag tárolva. Ezek az ideiglenes relációk, amelyek valamely lekérde-zés eredményeképpen jöttek létre. Ezekrol is ,,relációként" fogunk említésttenni.

8.1.1. Nézettáblák létrehozása

A legegyszerubb mód egy nézettábla létrehozására a következo:

CREATE VIEW <név> AS <definíció>;

A nézettábla definíciója egy SQL-lekérdezés.

8.1. példa. Tételezzük fel, hogy egy olyan nézet táblát szeretnénk, amely a

Filmek(filmcím, év, hossz, múfaj, stúdióNév, producerAzon)

reláció egy részét specifikálja, pontosabban a Paramount stúdió által gyártottfilmek címét és gyártási évét. Ezt a nézettáblát a következoképpen definiálhat-juk:

1) CREATE VIEW ParamountFilmek AS

2) SELECTfilmcím,év3) FROM Filmek4) WHEREstúdióNév= 'Paramount';

Az 1.sorban látható, hogy a nézettábla neve ParamountFilmek. A nézettáb-la attribútumait a 2. sor tartalmazza: filmdm és év. A nézettábla definíciója

a 2-4. sorok között található meg. O

8.2. példa. Nézzünk egy példát bonyolultabb lekérdezéssei definiált nézettáb-lára. A célunk a FilmProducer nézettábla létrehozása, amely a filmek címétés a producereik nevét tartalmazza. Ezt a nézettáblát a következo két relációfelhasználásával tudjuk definiálni:

Filmek(filmcím, év, hossz, múfaj, stúdióNév, producerAzon)

GyártásIrányító(név, cím, azonosító, nettóBevétel)

363

8.1.2. Nézettáblák lekérdezése

A nézettáblák pontosan ugyanúgy kérdezhetok le, mint a ténylegesen tároltalaptáblák. A FROMzáradékban megadjuk a nézettábla nevét, és a nézettábladefiníciójáthasználva az adatbázisrendszerre bízzuk, hogy eloállítsa a lekérde-zéshezszükségessorokat.

8.3. példa. Úgy kérdezhetjük le a ParamountFilmek relációt, mintha egy tá-rolt relációlenne:

SELECTfilmcímFROM ParamountFilmekWHERE év = 1979;

Ezzel a lekérdezéssei a Paramount által 1979-ben gyártott filmek címeit kapjuk

meg. O

8.4. példa. Írhatunk olyan lekérdezéseket is, amelyek nézettáblákat és alap-táblákat is tartalmaznak. Ilyen például a következo:

SELECT DISTINCT színészNév

FROM ParamountFilmek, SzerepelBenne

WHERE filmcím = filmCím AND

ParamountFilmek.év = SzerepelBenne.filmÉv;

Ez a lekérdezés a Paramount által gyártott filmekben szereplo összes színésznevét megadja. O

Azt, hogy mit is jelent a nézettáblák használata, a legegyszerubben úgyt~djuk megmutatni, hogyha a FROMzáradékban a nézettáblákat kicseréljük anezettáblákat definiáló alkérdéssel. Az alkérdést követo sorváltozóval tudunk az

a~kérdéssellétrehozott tábla soraira hivatkozni. Például a 8.4. példa lekérdezé-senek eredménye megegyezik a 8.1. ábrán látható lekérdezés eredményével.

a

Page 3: Nézetek és indexek - ELTE (nezettablak).pdfciók, azaz a "táblák" és a virtuális relációk, a ,,nézettáblák" között. Most, hogy már ismerjük a különbséget a tábla

364 8. Nézetek és indexek

SELECT DISTINCT színészNév

FROM (SELECT filmcím, év

FROM Filmek

WHERE stúdióNév = 'Paramount'

) Pm, SzerepelBenne

WHERE Pm.filmcím = filmCím AND Pm. év = SzerepelBenne.filmÉv;

8.1. ábra. A nézettábla használatának alkérdéssel való megvalósítása

8.1.3. Attribútumok átnevezése

Néha szeretnénk más attribútumneveket használni a nézettábla definíciójában,mint amelyek a nézettáblát definiáló lekérdezésMI adódnak. A nézettábla att-ribútumait megadhatjuk egy zárójelek közé írt lista formájában, amelyet aCREATEVIEWutasításban a nézettábla neve után kell írni. Például a 8.2. példanézettáblájának definícióját a következoképpen lehetne átírni:

CREATE VIEW FilmProducer(filmCím, producerNév) AS

SELECT Filmek.filmcím, név

FROM Filmek, GyártásIrányító

WHERE producerAzon = azonosító;

A nézettábla ugyanaz lesz, attól eltekintve, hogy az oszlopnevek nem f ilmdmés név, hanem filmCím és producerNév lesznek.

8.1.4. Feladatok

8.1.1. feladat. A következoalaptáblákból kiindulva:

FilmSzínész (név , cím, nem, születésiDátum)

GyártásIrányító(név, cím, azonosító, nettóBevétel)

Stúdió (név, cím, elnökAzon)

Építsük fel a következo nézettáblákat:

a) Egy GazdagProducer nézettáblát, amely a legalább 10000 000 $ nettóbevételu gyártásirányítók nevét, címét, azonosító számát és bevételét adjameg.

b) Egy StúdióElnök nézettáblát, amely azon gyártásirányítók nevét, címétés azonosító számát tartalmazza, akik stúdióelnökök is.

e) Egy ProdSzínész nézettáblát, amely azon személyek nevét, címét, nemét,születési dátumát, azonosító számát és nettó bevételét tartalmazza, akikegyben gyártásirányítók és színészek is.

8.2. Adatok módosftása nézettáblákon keresztül365

8.1.2. feladat. A 8.1.1. feladat nézettábláit használva (alaptáblák használatanélkül) adjuk meg a következo lekérdezéseket:

aj Keressük meg azoknak a noknek a neveit, akik gyártásirányítók és színé-szek is.

bJ Keressük meg azon gyártásirányítók neveit, akik egyben stúdióelnökök isés nettó bevételük legalább 10 000 000 $.

! ej Keressük meg azon stúdióelnökök nevét, akik egyben színészek is és nettóbevételük legalább 50 000 000 $.

8.2. Adatok módosítása nézettáblákon keresztül

Korlátozott módon lehetséges beszúrni, törölni vagy változtatni az adatokat egynézettáblán. Elso látásra teljesen értelmetlen ötletnek tunik, mivel a nézettáblanem létezik abban a formában, amelyben egy alaptábla (tárolt reláció) léte-zik. Mit jelent például egy új sor beszúrása egy nézettáblába? Hol tároljuk, éshonnan emlékezzen majd arra az adatbázis-kezelo, hogy a sor a nézettáblábakerült?

A legtöbb nézettábla esetén nem engedjük meg az ilyen beszúrást. Eléggéegyszeru nézettáblák esetén azonban a nézettábla módosítását átalakíthatjukaz alaptábla módosításává, amely ugyanolyan hatású lesz, mintha a nézettáb-lát módosítanánk. Az ilyen nézettáblákat módosítható nézettábláknak nevezzük.Az ,~nstead oP' (a kiváltó esemény helyett muködo) trigger is használható ar-ra, hogy a nézettábla módosítását az alaptábla módosításával végezze el. Ezzela programozó meg tudja határozni, hogy a nézettáblán keresztüli módosításhogyan történjen.

8.2.1. Nézettábla megszüntetése

A nézettábla különleges módosításának tekintheto a nézettábla megszüntetése.Ezt a ,~áltoztatást" akkor is végre lehet hajtani, ha a nézettábla nem módosít-ható. A megszüntetési utasítás:

DROP VIEW ParamountFilmek;

Ez az utasítás kitörli a nézettábla definícióját, tehát utána már nem kérdezhet-jük le és nem módosíthatjuk a nézettáblát. Ugyanakkor a nézettábla megszün-tetése nincs kihatással az alaptábla soraira. Ellenben, a

DROP TABLE Filmek

nemcsak a Filmek táblát szünteti meg, hanem a ParamountFilmeknézettáb-lát is használhatatlanná teszi, mivel az egy már nem létezo Filmek relációrahivatkozik.

Page 4: Nézetek és indexek - ELTE (nezettablak).pdfciók, azaz a "táblák" és a virtuális relációk, a ,,nézettáblák" között. Most, hogy már ismerjük a különbséget a tábla

366 8. Nézetek és indexek

8.2.2. Módosítható nézettáblák

Az SQL-szabvány formálisan leírja, mikor lehet egy nézettáblát módosítani ésmikor nem. Az SQL-szabályok bonyolultak, de nagyjából azt engedik meg, hogyegy R reláción (amely szintén lehet módosítható nézettábla) definiált nézettáb-lát módosíthassunk, ha definíciójában a SELECTután DISTINCTnem szerepel.Két fontos kikötés van:

. A WHEREzáradékban R nem szerepelhet egy alkérdésben sem.

. A FROMzáradékban csak R szerepelhet, csak egyszer fordulhat itt elo éssemmilyen más reláció nem szerepelhet (a FROMzáradékban).

.A SELECTzáradék listája elég attribútumot kell tartalmazzon ahhoz, hogyegy beszúrás esetén a többi attribútumot nullértékkel, vagy az alapértel-mezett értékkel tölthessük fel az alaptáblában. Például kötelezo az olyanattribútumérték megadása, mely NOTNULL-nakvan deklarálva és nincsalapértelmezett értéke.

A nézettáblába való beszúrás közvetlenül a nézettábla R alaptáblájába történik.Az egyetlen finom különbség az, hogy csak azon attribútumoknak tudunk ígyértéket adni, amelyek a nézettáblát definiáló SELECTzáradékban elofordulnak.

8.5. példa. Tételezzük fel, hogy 8.1. példában definiált ParamountFilmek né-zettáblába szeretnénk egy sort beszúrni a következo módon:

INSERT INTO ParamountFilmek

VALUES('Csillagok háborúja', 1979);

A ParamountFilmek nézettábla megfelel az SQL módosíthatósági feltételeinek,mivel a következo alaptábla néhány attribútumára vonatkozik:

Filmek(filmcím, év, mufaj, hossz, stúdióNév, producerAzon)

A ParamountFilmeknézettáblába való beszúrás a Filmektáblába való követ-kezo beszúrásként kerül végrehajtásra:

INSERT INTO Filmek(filmcím, év)

VALUES('Csillagok háborúja', 1979);

Megjegyezzük, hogy a nézettábla definíciója miatt ebben a beszúrásban csak afilmcímésév attribútumok kaphattak értéket, a Filmektábla többi attribú-tumainak nem tudtunk értéket adni.

A Filmek táblába beszúrandó sor attribútumértékei tehát: a filmcímattri-bútumértéke 'Csillagok háborúja', az év attribútumértéke 1979,azösszestöbbi attribútumértéke NULL.Minthogy a beszúrt sor stúdióNévattribútumá-nak értéke NULL,és ez a ParamountFilmek nézettábla válogatási feltételéneknem felel meg, így a beszúrt sornak a nézettáblára nincs hatása. Így például

8.2. Adatok módosftása nézettáblákon keresztül367

a 8.3. példa lekérdezése a most beszúrt sort ('Csillagok háborúja', 1979)nem fogja figyelembe venni.

Ezen anomália elkerülése végett a nézettábla definiálásakor a SELECTzára-dékban stúdióNév attribútumot is szerepeltetnünk kell:

CREATE VIEW ParamountFilmek ASSELECT stúdióNév, filmcím, év

FROM Filmek

WHEREstúdióNév = 'Paramount ' ;

Ezután a ParamountFilmeknézettáblába beszúrjuk a kívánt sort:

INSERTINTOParamountFilmekVALUES( 'Paramount " 'Csillagok háborúja', 1979);

Ez a beszúrás a Filmektáblára ugyanúgyhat, mint a következo:

INSERT INTOFilmek(stúdióNév,filmcím,év)VALUES('Paramount', 'Csillagokháborúja',1979);

Megjegyezzük, hogy bár a létrehozott sor a nem említett attribútumokon NULLértéket kap, de a ParamountFilmek nézettáblában éppen a beszúrás által meg-kívánt sort fogja eredményezni. D

A módosítható nézettáblákból törölhetünk is. A törlés, a beszúráshoz ha-sonlóan, az alaptáblában történik. Azért, hogy biztosítsuk azt, hogy csak azoka sorok törlodjenek, amelyek a nézettáblában láthatóak, a törlo utasítás WHEREzáradékához "és" (AND)logikai muvelettel hozzá kell kapcsolnunk a nézettáblátdefiniáló utasítás WHEREzáradékában szereplo feltételt.

8.6. példa. Tételezzük fel, hogy a módosítható ParamountFilmek nézettáb-lából szeretnénk kitörölni az összes olyan filmet, amelyek címe tartalmazza a,,háború" szót. Ezt a következo utasítás segítségével érhetjük el:

DELETEFROM ParamountFilmek

WHERE filmcím LIKE '%háború%';

A törlés átalakul egy, a Filmek táblára vonatkozó törlésre azzal a különbség-gel, hogy a ParamountFilmek nézettáblát definiáló lekérdezés WHEREfeltételehozzáadódik a törlés WHEREfeltételéhez:

DELETE FROM Filmek

WHERE filmcím LIKE '%háború%' AND stúdióNév 'Paramount ' ;

a muvelet eredménye. D

Hasonlóképpen, a módosítások is az alaptáblán keresztül történnek. A nézet-tábla módosításainak tehát az a hatása, hogy az alaptábla azon sorait módosítja,amelyek a nézettáblában sort eredményeznek.

Page 5: Nézetek és indexek - ELTE (nezettablak).pdfciók, azaz a "táblák" és a virtuális relációk, a ,,nézettáblák" között. Most, hogy már ismerjük a különbséget a tábla

368 8. Nézetek és indexek

Miért nem módosíthatók egyes nézettáblák?

Tekintsük a 8.2. példában eloforduló FilmProducer nézettáblát, amely afilmcímeket párosítja a gyártásirányítókkal. Ez a nézettábla az SQL definí-ciója szerint nem módosítható, mivel két relációra vonatkozik: a Filmek ésa GyártásIrányító relációkra. Tételezzük fel, hogy szeretnénk beszúrni akövetkezo sort:

('Indiana Jones és a halál templom', 'George Lucas')

A Filmek és a GyártásIrányító relációkba is be kellene szúrni egy-egysort. Az olyan attribútumokra, mint például a hossz vagy a filmcím, hasz-nálhatjuk az alapértelmezett értéket, de mit csináljunk a két egyenlové tettattribútummal, a producerAzon és az azonosító attribútumokkal? Hasz-nálhatnánk a NULLértéket számukra. Így azonban nem tudnánk összekap-csolni a két relációt, mert az SQL két NULLértéket nem tekint egyenlonek(lásd 6.1.6. alfejezet). Tehát az 'Indiana Jones és a haláltemplom' ésa ' George Lucas' nem kapcsolódna össze a FilmProducer nézettáblában,tehát a beszúrás nem lenne helyesen végrehajtva.

8.7. példa. A következo,nézettáblában történo módosítás:

UPDATE ParamountFilmekSET év = 1979

WHEREfilmcím = 'Csillagok háborúja film';

az alaptáblában ilyen alakban megy végre:

UPDATEFilmekSET év = 1979WHERE filmcím =

stúdióNév ='Csillagok háborúja film' AND'Paramount ' ;

D

8.2.3. Nézettáblákra vonatkozó ,,helyette" (instead-of)típusú triggerek

Ha nézettáblára vonatkozó triggert definiálunk, akkor a BEFOREés AFTERhelyettaz INSTEADOF-ot kell használnunk. Ha így járunk el, akkor ha egy eseménykiváltja a trigger muködését, akkor a triggerben megadott muveletek futnak lea trigger muködését kiváltó muvelet helyett. Így az instead-of típusú triggerelfogadja a nézettábla módosítási kísérletet, és helyette az adatbázis tervezojeáltal helyesnek gondolt muveletet hajtja végre. A következo egy tipikus példaerre.

8.2. Adatok módosítása nézettáblákon keresztül369

8.8. példa. Idézzük fel a Paramount által készített filmek nézettáblájának8.1. példában szereplo definícióját:

CREATE VIEW ParamountFilmek ASSELECT filmcím, évFROM Filmek

WHERE stúdióNév = ,Paramount ' ;

Amint a 8.5. példában megmutattuk, ez a nézettábla módosítható, de nem kí-vántkövetkezménnyeljár, ha ugyanis a ParamountFilmeknézettáblába beszú-runk egy sort, akkor a rendszer nem tudja kikövetkeztetni, hogy az alaptáblábatörténo beszúráskor a stúdióNév attribútum helyes értéke Paramount lesz-e,így a stúdióNév NULLértéket kap.

Jobb megoldást érhetünk el, ha egy erre a táblára vonatkozó, a 8.2. ábránlátható, ,,instead-of' típusú triggert hozunk létre. A triggerben nincs semmimeglepo. A 2. sorban látjuk az INSTEADOF kulcsszót, amellyel azt érjük el,hogy a ParamountFilmek nézettáblába való beszúrás nem jön létre, helyette eza trigger fog muködni.

1) CREATE TRIGGER ParamountInsert

2) INSTEAD OF INSERT ON ParamountFilmek

3) REFERENCING NEW ROW AS ÚjSor4) FOR EACH ROW

5) INSERT INTO Filmek(filmcím, év, stúdióNév)

6) VALUES(ÚjSor.filmcím,ÚjSor.év, 'Paramount');

8.2. ábra. A nézettáblába való beszúrást az alaptáblán történobeszúrásra cserélo trigger

A végrehajtani kívánt beszúrás helyett az 5. és 6. sorokban megadott akciókövetkezik be. Ez a Filmek táblába történo beszúrás, melyben a három ismertattribútumot adjuk meg. A filmcímés az év attril;>útumoka nézettáblábabeszúrni kívánt sorból származnak; ezen értékekre az ÚjSor sorváltozó névvelhivatkoztunk, melyet a 3. sorban deklaráltunk azért, hogy meg tudjuk nevez-ni azt a sort, amelyet a nézettáblába kíséreltünk meg beszúrni. A stúdióNévattribútum értéke a 'Paramount ' konstans. Ez nem a nézettáblába beszúrnikísérelt sor része, hanem abból a feltételezésünkbol következik, hogy a beszúrása ParamountFilmek nézeten keresztül érkezett. D

8.2.4. Feladatok

8.2.1. feladat. Melyek módosíthatók a 8.1.1. feladat nézettáblái közül?

8.2.2. feladat. Tegyük fel, hogy megkonstruáltuk a következo nézettáblát: