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:

  1. Vegyük a FROM záradékban szereplő relációk Descartes-szorzatát.
  2. Alkalmazzuk a WHERE záradék feltételét.
  3. 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 a SELECT 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 a WHERE záradékban jelenhetnek meg.

Példa:

  SELECT *
  FROM Teák
  WHERE név IN (SELECT tea
                  FROM Szeret
                  WHERE vendég = 'Fred');

Források