Miksi optimoidaan Relaatiotietokannan kyselyt esitetään käytännössä SQLkielellä. Kieli määrittää halutun tuloksen, ei sitä miten tulos muodostetaan (deklaratiivinen kyselykieli) Tietokannan käsittelyoperaatiot vastaavat relaatioalgebran operaatioita, tarvitaan muunnos määritelmällisestä muodosta proseduraaliseen. Tarjolla on useita vaihtoehtoja sekä operaatioiden että niiden järjestyksen suhteen Valitut tiedostorakenteet vaikuttavat siihen, miten tietokantaoperaatio kannattaa suorittaa Taulujen koko ja arvojen jakautumat muuttuvat jatkuvasti, tämä saattaa vaikuttaa siihen, miten kysely kannattaa toteuttaa Löydettävä tehokas tapa. ei ole todellista matemaattista optimointia tarkoitus ei ole löytää parasta vaan riittävän hyvä parhaan etsiminen on laskennallisesti raskasta taustatietoja ei yleensä ole riittävästi parhaan valintaan 1 2 Kyselyjen käsittely ja optimointi Kyselyn optimoinnin periaatteet Heuristinen optimointi (sääntöpohjainen optimointi) käytössä on joukko sääntöjä, joiden mukaisesti operaatiot järjestetään tai suoritustavat valitaan valinnat ennen liitoksia käytä indeksiä aina kun mahdollista jne. säännöt ovat yleiskäyttöisiä suoritustapa ei välttämättä ole optimaalinen Kyselyjen optimointi Kyselyn optimoinnin periaatteet Kustannuslaskentaoptimointi (tilastollinen optimointi) laaditaan vaihtoehtoisia suunnitelmia, esim. sääntöpohjalta lasketaan vaihtoehdoille kustannukset valitaan edullisin edellyttää tilastoaineistoa ja sen uudistamista ajoittain 3 4 Kyselyjen optimointi Kyselyn kääntäminen tuottaa tuloksenaan kyselypuun (käsiteltiin aiemmin) Kyselypuuta muokataan tehokkaammaksi ekvivalentiksi puuksi käyttäen ekvivalenssisääntöjä ja heuristisia optimointisääntöjä Heuristisia optimointisääntöjä: Konjunktiiviset valintayhdistelmät puretaan alkeisvalinnoiksi Valinnat painetaan mahdollisimman alas puussa Valinta ja ristitulo korvataan liitoksella Samalla algoritmilla suoritettavat operaatiot (esim. kaksi valintaa samaan tauluun) yhdistetään uun lehdet järjestetään siten, että rajaavimmat operaatiot (pienin tulosjoukko) suoritetaan ensin (puuta käydään läpi vasemmalta alhaalta alkaen) Operaatiot järjestetään siten, että vältetään välitulosten kirjoitus 5 6 Harri Laine 1
-käännös Tarkastellaan tietokantaa Teos(tnro,nimi, ) 30000 riviä Kurssi(nro,kurssinimi, ) 200 riviä Materiaali(kurssi->Kurssi,kirja->Teos, tyyppi, ) 1000 riviä Halutaan saada selville, mitkä teokset on määritelty kurssin Kyselykielet oheismateriaaliksi 7 8 -käännös -käännös 9 10 -käännös -käännös 11 12 Harri Laine 2
-käännös -käännös S() 13 14 -käännös heuristiset säännöt S() Liitos=ristitulo+valinta S() 15 16 heuristiset säännöt Valinnat alas S() 17 Ilman tilastotietoja on vaikea päästä pidemmälle. Rajaavuutta voi arvioida oikeastaan vain, jos valinta perustuu taulun avaimeen. Koska yleisesti ei kannata määritellä indeksiä, jos arvojoukko on pieni, voi tähän perustuen olettaa indeksiperustana käytettyihin sarakkeisiin liittyvien yhtäsuuruusvalintojen olevan kohtuullisen rajaavia Kustannuslaskentaoptimoinnissa käytetään hyväksi tilastotietoa: Taulun koko Tietueen koko Tietueiden lukumäärä sivulla Erilaisten arvojen lukumäärä sarakkeessa Arvojen jakautuminen sarakkeessa (ns. histogrammit) Sivujen täyttösuhteet, 18 Harri Laine 3
- kustannuslaskenta - kustannuslaskenta Tilastotiedot antavat mahdollisuuden arvioida rajaavuutta ja tuloksen kokoa ja myös operaation kustannuksia. Kustannuslaskentaoptimoinnissa lasketaan kustannukset joukolle vaihtoehtoja ja valitaan näistä edullisin. Kustannus voidaan laskea joko sivuhakujen määränä tai jollain kustannusfunktiolla joka yrittää ottaa huomioon myös sivuhakujen luonteen peräkkäis-/satunnaishakuja 19 Kurssinimiä n.200, lähes yhtä paljon kuin kursseja, tyyppejä 5, akautuneet tasaisesti. Tulos: ~1 Raj:1/200 Tulos: ~ 200 S() Raj:1/200 Raj:1/5 20 - kustannuslaskenta = indeksihaku = indeksiliitos = selaus siss=sisäkkäiset silmukat jarj= järjestäminen =putki siss Tulos: ~ 200 S() jarj kurssinimi kurssi tnro 21 Olkoon yllä olevat indeksit - kustannuslaskenta Kurssi: 5/sivu Materiaali: 10/sivu Teos 5/sivu Ei mitään putken takia YHT: 2+100+3=105 sivuhakua 1000/10=100 (data) 1(ind)+1(data) siss Tulos: ~ 200 S() jarj 2 (ind)+1 (data) 22 - kustannuslaskenta Yht:2+7+3=12, parempi jarj 2 (ind)+1 (data) Ei mitään 2(ind)+5(data) 1(ind)+1(data) S() kurssinimi kurssi 23 - kustannuslaskenta Optimoijat eivät välttämättä tutki kaikkia vaihtoehtoja Esimerkiksi useiden liitosten järjestyksen määräämiseksi käytetään yleisesti ns. vasensyvää puuta (left deep tree). Tässä liitosrakenne on muotoa ((A join B) join C) join D... eli valmiiseen tulokseen liitetään taulu kerrallaan lokaalia optimointia: mikä liitos kannattaa tehdä ensin, mikä kannattaa liittää sitten tämän tulokseen, jne muotoa (A join B) join (C join D) olevia liitosrakenteita ei edes arvioida 24 Harri Laine 4
- kustannuslaskenta Kustannuslaskennan pohjana oleva tilastojen keräys voi tapahtua automaattisesti tai erikseen pyydettäessä. Järjestelmät tarjoavat usein myös mahdollisuuden kysyä, millaiseen suoritussuunnitelmaan optimoija on päätynyt. Oraclessa eplain plan kirjaa suunnitelman tietokantatauluun 25 Harri Laine 5