Helsingin yliopisto, Tietojenkäsittelytieteen laitos Kyselykielet, s 2006, Harjoitus 5 (7.12.2006) Tietokannassa on tietoa tavaroista ja niiden toimittajista: Supplier(sid,sname,city,address,phone,etc); [300 riviä, a 400B] Supply(sid->Supplier, pid->part, price); [20000 riviä. a 40B] Part(pid,pname,descr,etc); [2000 riviä, a 1000B] Tarkastellaan kyselyä: SELECT S.sname, P.pname FROM Supplier S, Part P, Supply Y WHERE S.sid = Y.sid AND Y.pid = P.pid AND S.city = 'Espoo' AND P.price > 1000; Taulut on toteutettu järjestämättöminä peräkkäisrakenteina. Sivuille ei lisättäessä jätetä kasvuvaraa. Kasvuvaraa ei jätetä. Sivukoko on 4KB (~4000B). Olkoon taululla Part hajauttamalla toteutettu tiheä oheishakemisto sarakkeen pid perusteella ja taululla Supply hajauttamalla toteutetut tiheät oheishakemistot sarakkeiden pid ja sid perusteella. Oletetaan että toimittajia toimii 10 paikkakunnalla ja yli 1000 rahan hintaisia osia on 1% osista). Muistitilaa on käytettävissä 200 sivun verran. Tee tarvittavat lisäoletukset. 1. a) Laadi suoraviivaisesti kyselyä vastaava optimoimaton kyselypuu.
b) Sovella heuristisia sääntöjä kyselypuun uudelleen järjestämiseksi tehokkaampaa suoritusta varten. Vaihtoehtoja 1: Vaihtoehto2: Vaihtoehto 3:
2. a) Arvioi yllä olevan kyselyn vastauksen koko Lasketaan vaihtoehdosta 1: Toimittajia (Supplier) 300 10 kaupungissa, joten Espoossa 30. Saatavuuksia 20000/300 = 67 yhtä toimittajaa kohden Espoolaisten toimittajien ja saatavuuksien liitos tuottaa 30*67 =2000 riviä Osista 1% yli 1000 rahan hintaisia, joten valinta tuottaa 20 riviä Espoolaisten toimittajienkin saatavuuksista 1% kohdistuu yli 1000 rahan tuotteisiin, joten liitos tuottaa 20 riviä Yli 1000 rahan hintaisia on 20 kpl, joten lopputulos selvästi alle 20.. b) Laadi kyselylle toteutussuunnitelma ja arvioi sen suorituskustannus (sivuhakujen määränä) Lasketaan aluksi taulujen koot sivuina: supplier 300/(4000/400) = 30 sivua supply 20000/(4000/40) = 200 sivua part 2000/(4000/1000)= 500 sivua Vaihtoehdossa 1: Valitut toimittajat vaativat 3 sivua.. Toimittajien ja saatavuuksien liitoksen tulosrivin koko 340B (näitä mahtuu sivulle n. 11) eli 2000 riviä vaatisi noin 180 sivua, mutta tilantarvetta voisi karsia projisoimalla jatkoon vain tarvittavan tiedon (pid) n.10b, jolloin tuloksen taltiointiin riittäisi 10 sivua. Tulos kuitenkin mahtuisi myös täysinä tietueina käytössä olevaan 200 sivuun. Jos Supplier&Supply liitos tehdään sisäkkäisten silmukoiden menetelmällä käyttäen ulompana Espoolaisia topimittajia riittää käydä Sypply-taulu läpi kertaalleen. Seuraavaa liitosta varten voidaan pitää edellisen tulos keskusmuistissa joten riittää käydä taulu parts kertaalleen läpi tehdä ensin valinnat ja sitten liitos. Tarvitaan 30+200+500 =730 sivun lukeminen ja tuloksen kirjoitus. Hajautusindeksin käyttö toimittajien ja saatavuuksien liitoksessa vaatii teoriassa 30*(1+67) hakua eli yli 2000 (samoja sivuja haetaan moneen kertaan). Paljonko sivuhakuja todellisuudessa tarvitaan, riippuu käytettävissä olevan muistin määrästä. Tämä on kuitenkin hitaampi ratkaisu kuin sisäkkäiset silmukat. Vaihtoehdossa 2 valinnan nostaminen osien liitoksen jälkeen mahdollistaisi hajautusindeksin käytön. Koska haettavia on kuitenkin 2000, tämä vaatii enemmän hakuja kuin sisäkkäiset silmukat. Vaihtoehdossa 3 löytyy 20 kallista osaa., eli muistitilaa tarvitaan tulokselle 5 sivua. Osien ja niiden saatavuuden liitos tuottaa 200 riviä, eli kokonaisilla tietueillakin laskettuna n 70 sivua ja vain tarpeelliseen projisoituna (name+sid) korkeintaan 4 sivua. Sisäkkäisillä silmukoilla toteutettaessa pitää lukea Supply kertaalleen. (200 sivua). Indeksiliitosta käytettäessä tarvittaisiin (20*(1+10)) =220 teoreettista hakua, eli samaa kokoluokkaa, mutta ei kyetä hyödyntämään peräkkäisyyttä. Toinen liitos hoituu sisäkkäisillä silmukoilla. Sivuhakujen määrä sisäkkäisiä silmukoita käytettäessä on sama kuin vaihtoehdossa 1, mutta muistitilan tarve on selvästi vähäisempi.
3. Tarkastellaan kyselyä SELECT S.sname, S.city, P.price FROM Supplier S, Part P, Supply Y WHERE P.pid=22645 and S.sid = Y.sid AND Y.pid = P.pid Laadi kyselylle toteutussuunnitelma ja arvio kustannuksista. Haku osanumeron perusteella voidaan tehdä indeksiä käyttäen, joten tarvitaan 1+1 sivuhakua. Liitos Supply-tauluun hakemistoliitoksena tuottaa 1*(1+10) sivuhakua. 20 rivin liittäminen Supplier-tauluun vaatisi hakemistoliitoksena 20*(1+1) < 40 sivuhakua ja sisäkkäisten silmukoiden tekniikalla 30 peräkkäisyyttä hyödyntävää hakua. Eli yhteensä vähintään 2+11+30=43 sivuhakua. 4. Tarkastellaan XML-tiedostoa osoitteessa http://www.w3schools.com/xml/cd_catalog.xml a) Hahmottele algoritmi, miten sarjallisella tapahtumapohjaisella XML-käsittelyllä selvittäisit Dolly Partonin levyjen nimet ja hinnat. Muuttuja vuorossa ilmaisee minkä tyyppinen elementti on käsittelyssä Tallenne[elementtityyppi] säilyttää elementin datan. Käynnistä lukusilmukka kunnes tiedosto käsitelty tapahtumakäsittelijät (oletetaan saatavan alku, loppu ja data ilmoituksia alku( CD ): {tyhjennä tietorakenteet vuorossa= CD } alku(muu elementti kuin CD) {vuorossa=elementin nimi} loppu( CD ). {if (tallenne[ ARTIST ]== Dolly Parton ) print(tallenne[ TITLE ],tallenne[ PRICE ]);
tyhjennä tietorakenteet;} loppu(muu kuin CD) {vuorossa=nill} data; {tallenne[vuorossa]=data_arvo} b) Hahmottele saman ongelman ratkaisu käyttäen dokumenttipuun käsittelymetodeja ja solmujen ominaisuuksia (esimerkkejä dokumenttipuun käsittelystä löytyy esim. jättämällä yllä olevasta linkistä viimeinen osa pois). doc= Load( http://www.w3schools.com/xml/cd_catalog.xml ) var x= doc.getelementsbytagname( ARTIST ) for (var i=0,i++,i>x.length) { if x[i].childelement[0].nodevalue= Dolly Parton { var p=x.parent var title=p.getelementsbytagname( title ); var price=p. getelementsbytagname( price ); output(title.childelement[0].nodevalue, price.childelement[0].nodevalue) } } 5. a) Miten Dolly Partonin levyjen nimet ja hinnat haetaan XPath:n polkulausekkeilla //CD[ARTIST= Dolly Parton ]/TITLE //CD[ARTIST= Dolly Parton ]/PRICE Jos Dolly Partonita olisi momta levyä kokoelmassa tässä ei saataisi otsaketta ja hintaa pareina. c) Ratkaise a-kohdan ongelma XQuery kielellä. let $d=doc('http://www.w3schools.com/xml/cd_catalog.xml ) for $x in $d/catalog/cd[artist= Dolly Parton ] return <SCD>{$x/TITLE}{$x/PRICE}</SCD>