{{predmet|Dotazovací jazyky I|Jaroslav Pokorný|DBI001}} Dotazovací jazyky, povídání o SQL.

  • zkouška: písemná – příklady

  • zápočet: referát na semináři (po dvojicích, PowerPointová prezentace), jinak psané (Word)

Odkazy

Zkoušky

Je dobré si úlohy skúsiť vyriešiť najprv samostatne, pre niektoré úlohy boli zverejnené aj riešenia.

26. 1. 2012

Nebylo tam nic, co neni na tady, velká část se kryla s písemkou co je na wiki z 10.2.2009, nebylo tam ale vůbec nic z optimalizace a na DIS tam byla tabulka věcí a rozhodnout, jestli zvyšuje P nebo R.

Bodování úloh docela mírný (třeba v OR stačí přibližná syntaxe, hlavně když je tam myšlenka), známkování naopak trošku přísnější - 22-19: 1, 18,17: 2, 16,15 (nejsem si úplně jistej): 3, 14-0: 4.

Takže umět pořádně SQL, počítat přístupy v nested loops a alespoň navrhnout OR model a je to solidní základ na projití.

10.2.2009

    1. Dotazovanie nad zadanou schemou (boldom su kluce)

Pobocka(meno_pivovaru, meno_pobocky, adresa)

Vari(meno_pivovaru, meno_pobocky, znacka, stupen)

Odobera(hospoda, znacka, stupen, meno_pivovaru, cena) (kluc si nepamatam)

  • Q1: Pivovary, kt. pivo nikto neodobera. (cez having to ide velmi jednoducho)

  • Q2: Pivovary, kt. nejaku znacku (piva) nikto neodobera.

    1. previest schemu do OR s pouzitim REF, kolekcii (napisat dotazy pre CREATE TYPE a odpovedajuce CREATE TABLE, pozor v SQL1999 je iba ARRAY)... Nad danou schemou spravit dotaz:

Vsetky hospody, vsetky znacky a stupne, ktore sa v nich varia? (neviem, ci je to presne ono)

    1. Vysvetlit, kedy je v RA mozne spravit: (E1 x E2) (selekcia) = E1(selekcia) x E2

    1. Pocitanie pristupov na stranky: p<sub>R</sub> = 200, b<sub>R</sub> = 10, p<sub>S</sub> = 500, b<sub>S</sub> = 5, M = 42, spojenie R[A=B]S, max 5 n-tic z S spojitelnych s kazdou n-ticou z R

    • a) nested loops, pocet pristupov

iba vzorec p<sub>R</sub> + (p<sub>R</sub>*p<sub>S</sub>)/(M-2) = 2700

  • b) nested loops, 2-urovnovy klastrovany B+ index nad B v S, pricom vsetky spojitelne n-tice z S pre vybranu n-ticu z R sa nachadzaju v 1 stranke

p<sub>R</sub> + n<sub>R</sub>(2+1) = p<sub>R</sub> + 3*n<sub>R</sub> = 200 + 6000 = 6200 Vysvetlenie: Relaciu R musim nacitat celu (p<sub>R</sub>) a pre kazdy zaznam (celkovo ich je n<sub>R</sub> = p<sub>R</sub> * b<sub>R</sub> = 2000) potrebujem 2 pristupy v indexe na najdenie pozadovanej stranky (v ktorej su vsetky zaznamy spojitelne s aktualnou n-ticou z R) + 1 pristup na nacitanie tejto stranky.

  • c) nested loops, 2-urovnovy NEklastrovany B+ index nad B v S

p<sub>R</sub> + n<sub>R</sub>(2+5) = p<sub>R</sub> + 7*n<sub>R</sub> = 200 + 14000 = 14200 Vysvetlenie: Relaciu R musim nacitat celu (p<sub>R</sub>) a pre kazdy zaznam (celkovo ich je n<sub>R</sub> = p<sub>R</sub> * b<sub>R</sub> = 2000) potrebujem 2 pristupy v indexe na najdenie pozadovanej stranky + max. 5 roznych stranok najst (pretoze max. 5 n-tic je spojitelnych a kedze ide o neklastrovany index, mozu byt kdekolvek)

  • d) spocitat pripad c), ak vieme, ze A bude zotriedena a pocet listov indexu je 16:

tusim, ze: p<sub>R</sub> + 1 + n<sub>R</sub> * ( 1/16 + 5) myslim, že je to spíš takhle: p<sub>R</sub> + 1 + 16 + n<sub>R</sub> * 5, zdůvodnění mi připadá v pořádku, možná drobné doplnění:

když načítam další stránku R, ponechávám si aktuální stránku indexu a pokračuji z toho místa, není třeba procházet stránky indexu víc jak 1x, tzn 16 přístupů. Jookyn

Vysvetlenie: Relaciu R musim nacitat celu (p<sub>R</sub>), 1 stranka na pristup do 1.urovne indexu nad B a pre kazdy zaznam v A hladam n-tice z S, ale vyuzivam to, ze A je zotriedena a index je B+ - teda nemusim vzdy pristupovat na 1.uroven indexu, ale posuvam sa iba po listoch, tych je 16. No a este pristup na stranky, kde su n-tice z S (tych je max. 5))

    1. Sim(Q,Di) zadana skalarnym sucinom, kde q1, q2 a q3 su nenulove. Ako to bude vyzerat v boolskom modeli?

Odpoved: t<sub>1</sub> OR t<sub>2</sub> OR t<sub>3</sub> (kde t<sub>1</sub>, t<sub>2</sub>, t<sub>3</sub> su prislusne termy)

Ak tam su nejake nejasnosti, sorry, snazil som sa napisat vsetko, co som si zapamatal.

3.2.2009

Tak co se objevilo v dnešní zkoušce, jedná se jen o doplnění předchozích příkladů:

    1. máme počty stránek p<sub>R</sub>, p<sub>S</sub> a blokovací faktory b<sub>R</sub> b<sub>S</sub> a počet stránek paměti M, spojení je R[A=B]S, přičemž ke každé n-tici z R je max. 5 n-tic z S

    • a) spočtěte počet čtení přes hnízděné cykly (2 body)

      • řešení: p<sub>R</sub> + p<sub>R</sub>*p<sub>S</sub>/(M-2)

    • b) spočtěte počet čtení přes hnízděné cykly když nad B je 2-úrovňový klastrovaný index, a ke každé n-ticy z R jsou n-tice z S uloženy v jedné stránce (3 body)

      • řešení: p<sub>R</sub> + n<sub>R</sub>*I(B,S)*1 (za správnost neručím)

      • řešení: p<sub>R</sub> + n<sub>R</sub>*(I(B,S)+1) ... a neni to spis takhle? Lukas

    • c) spočtěte počet čtení přes hnízděné cykly když nad B je 2-úrovňový obyčejný index (3 body)

      • řešení: p<sub>R</sub> + n<sub>R</sub>*I(B,S)*5, kde n<sub>R</sub> = p<sub>R</sub>*b<sub>R</sub> (za správnost neručím)

      • řešení: p<sub>R</sub> + n<sub>R</sub>*(I(B,S)+5) ... a neni to spis takhle? Lukas

    • upozornění: spočtěte znamená napsat číslo, ne jen vzoreček;

    1. DIS - jaké bude q<sub>k</sub> (viz. vzoreček ze slajdů) když v dotazu budou pouze klíčová slova

    • řešení: q<sub>k</sub> = IDF<sub>k</sub> protože TF<sub>k</sub> = 1 a maxTF<sub>k</sub> = 1

    1. DIS - spočítat vektor D = TF<sub>k</sub>*IDF<sub>k</sub>, když TF<sub>k,m</sub> a DF<sub>k</sub> byly zadány

    1. Schéma: viz to schema nize s tabulkami Herec, Hraje_v a Film

    • vybrat všetkých hercov, ktorí hrali vo vsech filmoch režírovaných Formanom (3b)

    1. Upravit schéma ze 4) na OR model s tim, že do databáze pribudou i jiné osoby. Narozdil od kteresi minule pisemky se tu pozadovalo ponechani HerecId a FilmId a pouziti typu kolekce. Ve výsledku mely byt 2 relace (3b).

    • Napísať v tomto novom shémate dotaz D3: Pre každého herca zistiť počet Formanových filmov (režírovaných Formanom) do ktorých boli obsadení.

28.1.2009

Jen doplnění věcí:

  • Spojení relací R * S pomocou hnízděných cyklů: p<sub>R</sub> = 2000, b<sub>R</sub> = 20, p<sub>S</sub> = 5000, b<sub>S</sub> = 50, počet bufferů M = 402.

    • Pozn. k řešení: Jen naházet do vzorečku p<sub>R</sub> + p<sub>R</sub> * p<sub>S</sub> / (M - 2).

  • Byla tam tabulka a pro každý řádek určit, zda zvyšuje či snižuje P (přesnost) a R (úplnost)

    • P R

    • +  -     AND

    • -  +     OR

    • -  +     zástupné znaky

    • -  +     tezaurus (myslím)

    • -  +     lemmatizace (myslím)

    • +  -     rozlišování velkých a malých písmen

    • +  -     rozlišování frází

    • ... nějaké další

  • V otázce udělat dotaz nad OO modelem byl dotaz: Vyberte všechny herce a k nim počet Formanových filmů, ve kterých měli roli.

21.1.2009

Většinou se příklady opakují z minulých roků. *1.) Schéma:

<span style="line-height: 100%"> <font style="font-family: Courier New">

+---------+ +-------------+ +----------+ | Agent | | Dum | | Vybaveni |

+---------+ +-------------+ +----------+ | A_Id | - | Adresa | -- | Adresa |

| A_Jmeno | \ | Vlastnik_jm | | Rys | +---------+ -| A_Id | +----------+

            +-------------+

</font>

</span>

  • Napsat dotaz, který vypíše jména těch vlastníků domů, jejichž domy spravuje pouze jeden agent (přes having to jde hezky)

*2.) Vytvořit OO model, nesmí se ztratit žádná informace, mělo se využít systémově generovaných OID. *3.) Dotaz nad vzniklých OO schématem.

*4.) TFxIDF na dvou větách, pouze s podstatnými jmény. *5.) Spočítat Similarity pro dva dotazy a seřadit je podle relevantnosti (dotazem se tady myslí nějaká věta, podle toho jestli obsahuje slovo nebo ne se dává váha 0 nebo 1)

*6.) Nakreslit strom dotazu viz písemka z 17.1.2008 př. 8a) *7.) Pro schéma nahoře spočítat IO operací.

  • Agent: 200 záznamů, blokovací faktor 10, jednoúrovňový index nad A_ID

  • Dům: 1000 záznamů, blokovací faktor 4, klastrovaný dvouúrovňový index nad Adresou => 250 stránek

  • Rys: 10 000 záznamů, blokovací faktor 10, klastrovaný dvouúrovňový index nad Adresou

  • Pozn. k řešení: Protože agentů je 200 a domů 1000, tak připadá na agenta cca 5 domů. Protože domů je 1000 a vybavení 10 000, tak na dům připadá cca 10 rysů. Agenta 007 lze si vyhledat na (1 + 1) přístupů (jeden za zalezení do indexu a pak načtení jednoho agenta). Pak lze projít domy a vybrat ty, které mají agenta 007 (nad A_ID nebyl u domů index) -je tedy potřeba načíst 250 stránek. Při tom k nim jde lepit zároveň agenty. Na výsledek joinu agentů s domy provedeme join, který veme 5*(2 + 2) IO operací (po joinu nám zbylo cca 5 domů - záznamů, které měli agenta 007; pro každý dům musíme načíst vybavení, tzn. 2 IO pro zalezení do indexu a pak ještě načíst cca 10 záznamů vybavení - protože jsou kvůli klastrovanému indexu záznamy jedné adresy u sebe, stačí je sekvenčně načíst ... 10 záznamů veme max 2 stránky - blokovací faktor je totiž 10 a na jeden se asi netrefíme). Výsledek teda mohl být: (1 + 1) + 250 + 5 * (2 + 2) = 272. (Toto bylo moje řešení, které prošlo - když tak mě opravte, jestli je něco špatně).

*8.) Nakreslit optimalizovaný strom. *9.) Kolik bude potřeba IO operací, když u domů bude klastrovaný index i nad A_Id.

  • Pozn. k řešení: V tomto případě načteme domy agenta 007 rychleji ... místo 250 stačí (2 + 2) IO operací (dvě na zalezení do indexu a pak načtení cca 5 domů - ty se při blokovacím faktoru 4 vlezou do 2 stránek).

17.1.2008

Stupnica 24-21 - 1; 20-19 - 2; 18-17 - 3 *1.) Schéma:

<span style="line-height: 100%"> <font style="font-family: Courier New">

+---------+ +---------+ +---------+ | Herec | | Hraje_v | | Film |

+---------+ +---------+ +---------+ | HerecId | -- | HerecId | / | FilmId |

| Jméno | | FilmId | / | Titul | | Adresa | +---------+ | Režisér |

+---------+ +---------+ </font>

</span> - vybrat všetkých hercov, ktorí hrali vo vsech filmoch režírovaných Formanom (3b)

31.1.2007

19.1.2006

10.2.2005

7.2.2005

22.1.2005