Relációs algebra lekérdezések optimizációja és bevezetés az SQL-be
- Relációs algebra lekérdezések optimizációja és bevezetés az SQL-be
Relációs algebra lekérdezések optimizációja
Cél: a feladatot minél kevesebb adatmozgatással tudjunk megoldani a háttértár és a központi memória között.
- Minél kevesebb disk I/O művelet végrehajtása egy-egy lekérdezés végrehajtása során.
- Az optimalizáció során relációs algebrai azonosságok alkalmazása. ()
- Eredetivel ekvivalens lekérdezés készítése, kiszámításához az esetek többségében kevesebb I/O művelet
Algebrai azonosságok
Descartes-szorzat és összekapcsolások
Projekció és szelekció
Kiválasztás és Descartes-szorzat/összekapcsolás
Projekció/kiválasztás és halmazműveletek
Optimizációs stratégiák
- Feltételek darabolása és letolása (minél előbb szűrjünk)
- Projekciók letolása (projektáljunk minél előbb)
- Utolsó lépésként kifejezések helyettesítése természetes összekapcsolással, -összekapcsolással.
Ha diszjunkciók is megjelennek, azok nehezíthetik a lekérdezések optimalizációját.
Bevezetés az SQL-be
Az SQL magas szintű programozási nyelv.
Az adatbázis-kezelő rendszer kitalálja a leggyorsabb végrehajtási módot.
SELECT -- az érdekes attribútumok
FROM -- egy vagy több tábla
WHERE -- a táblák soraira vonatkozó feltételek
AS -- átnevezés
LIKE -- mintaillesztés
IN -- eleme
A lekérdezés jelentése
- Kezdjük a
FROM
záradékban megadott relációval. - Alkalmazzuk a
WHERE
záradékban megadott kiválasztási feltételt. - Levetítjük az eredményt a
SELECT
záradékban megadott oszlopokra.
A SELECT
záradékban megjelenhet algebrai kifejezés, például:
SELECT teázó, tea, ár*114 AS árJenben
FROM Felszolgál
Információ integráció
- Sokszor az adatbázisokat sok forrásból építik fel (adattárházak).
- Tegyük fel, hogy minden teázónak van egy saját Menü(tea, ár) táblája.
- A Felszolgál(teázó, tea, ár) tábla elkészítéséhez minden ilyen táblát fel kell dolgoznunk és a teázó nevét konstansként kell beszúrnunk.
Például Joe teázója esetében ezzel a lekérdezéssel dolgozhatunk:
SELECT ’Joe teázója’, tea, ár
FROM Menü;
A WHERE
zárdékában logikai kifejezéseket is használhatunk.
Minták
A feltételekben a sztringeket mintákra illeszthetjük a LIKE
kulcsszóval.
Minta aposztrófok közötti szöveg az alábbi jelekkel: % = “akármennyi karakter”; _ = “tetszőleges karakter, pontosan egy.”
Például:
SELECT név
FROM Vendégek
WHERE cím LIKE '%Budapest%';
NULL összehasonlítás
Az SQL valójában 3-értékű logikát használ: TRUE, FALSE, UNKNOWN
.
Ha egy értéket (NULL
értéket is beleértve) NULL
-lal
hasonlítunk, az eredmény UNKNOWN
.
Egy sor akkor és csak akkor kerül be az eredménybe,
ha a WHERE
záradék TRUE
értéket ad.
Többrelációs lekérdezések
Általában több táblából kell kinyernünk az adatokat.
Ekkor a relációkat a FROM záradékban kell felsorolnunk.
Az azonos attribútum neveket az alábbi módon különböztetjük meg egymástól:
<reláció>.<attribútum>
.
Példa:
SELECT tea
FROM Szeret, Látogat
WHERE teázó = 'Joe teázója' AND
Látogat.vendég = Szeret.vendég
Szemantika
Formális szemantika
Majdnem ugyanaz, mint korábban:
- Vegyük a
FROM
záradékban szereplő relációk Descartes-szorzatát. - Alkalmazzuk a
WHERE
záradék feltételét. - Vetítsünk a
SELECT
záradék oszlopaira.
Operációs szemantika
Képzeljük úgy, mintha minden FROM
záradékbeli táblához tartozna
egy sorváltozó.
- Ezekkel a sorok összes lehetséges kombinációját vesszük.
- Ha a sorváltozók a
WHERE
záradékot kielégítő sorra mutatnak, küldjük el ezeket a sorokat aSELECT
záradékba.
Explicit sorváltozók
Esetenként egy tábla több példányára is szükségünk van.
- A
FROM
záradékban a relációk neve után adjuk meg a hozzájuk tartozó sorváltozók nevét. - Egy relációt mindig átnevezhetünk ily módon, akkor is, ha egyébként nincs rá szükség.
Példa: önmagával vett összekapcsolás
SELECT b1.név, b2.név
FROM Teák b1, Teák b2
WHERE b1.gyártó = b2.gyártó AND
b1.név < b2.név;
Alkérdések
A FROM
és WHERE
záradékban zárójelezett
SELECT
-FROM
-WHERE
utasításokat (alkérdés) is
használhatunk.
Példa: a FROM
záradékban a létező relációk
mellett, alkérdéssel létrehozott ideiglenes táblát is
megadhatunk.
- Ilyenkor a legtöbb esetben explicite meg kell adnunk a sorváltozó nevét.
SELECT tea
FROM Szeret, (SELECT vendég
FROM Látogat
WHERE teázó = 'Joe teázója')JD
WHERE Szeret.vendég = JD.vendég;
Az IN művelet
<sor> IN (<alkérdés>)
igaz, akkor és csak akkor, ha a sor eleme az alkérdés eredményének.- Tagadás:
<sor> NOT IN (<alkérdés>)
. - Az
IN
-kifejezések aWHERE
záradékban jelenhetnek meg.
Példa:
SELECT *
FROM Teák
WHERE név IN (SELECT tea
FROM Szeret
WHERE vendég = 'Fred');