PN-puu Erno Härkönen Helsinki 24.10.2006 Seminaari: Tietokannat nyt HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos
HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta/Osasto Fakultet/Sektion Faculty Laitos Institution Department Matemaattis-luonnontieteellinen Tekijä Författare Author Erno Härkönen Työn nimi Arbetets titel Title Tietojenkäsittelytieteen laitos PN-puu Oppiaine Läroämne Subject Tietojenkäsittelytiede Työn laji Arbetets art Level Aika Datum Month and year Sivumäärä Sidoantal Number of pages Seminaari 24.10.2006 12 sivua Tiivistelmä Referat Abstract Moniulotteisia hakemistoja käytetään nopeuttamaan hakuja tietokannoista, joissa tietueet pitää indeksoida useamman attribuutin mukaan. PN-puu on yksi tällainen moniulotteinen hakemisto. PN-puu kasaa avaruudessa lähekkäin olevat olevat pisteet samalle levyn sivulle, jotta ne löytyvät tehokkaasti hakuja toteutettaessa. PN-puun käyttämät algoritmit voidaan helposti jakaa rinnakkain suoritettaviin osatehtäviin. ACM Computing Classification System (CCS): E.1 [Data structures] H.2.8 [Database applications] Avainsanat Nyckelord Keywords PN-puu, moniulotteiset hakemistot Säilytyspaikka Förvaringsställe Where deposited Muita tietoja övriga uppgifter Additional information
Sisältö ii 1 Johdanto 1 2 Moniulotteiset hakemistot 2 3 PN-puu 2 3.1 Lisäysalgoritmi.............................. 4 3.2 Hakualgoritmi............................... 5 3.3 Poistoalgoritmi.............................. 8 4 PN-puun toteutus 8 4.1 Projektioiden tallentaminen....................... 8 4.2 Lähimmän naapurin etsintä....................... 10 5 Yhteenveto 11 Lähteet 11
1 Johdanto 1 Hakemistoja käytetään mm. nopeuttamaan hakuja aineistosta ja vähentämään levylle kohdistuvia operaatioita. B+-puu on yksi tällainen yleisesti käytetty tietokantojen hakemistorakenne. Hakemisto muodostetaan tietyn attribuutin mukaan ja järjestyksessä peräkkäiset tietueet löytyvät levyltä lähekkäin. Maantieteellistä paikkatietoa sisältävät tietokannat ovat esimerkki tapauksista, joissa tietueet tulisi indeksoida usean attribuutin mukaan [GG98]. Paikkatietokannat ovat usein hyvin laajoja ja siksi ne joudutaan säilyttämään massamuistin puolella. Hakemistojen tulisi toimia tehokkaasti myös silloin, kun aineisto muuttuu lisäyksillä ja poistoilla usein. Perinteiset yksiulotteiset hakemistot eivät ole tehokkaita moniulotteisten hakujen suorittamiseen, joissa yksi tietue tarvitsee indeksoida usean attribuutin perusteella. Tämä johtuu siitä, että ei ole olemassa täydellistä kuvausta useampi ulotteisesta avaruudesta yksiulotteiseen avaruuteen, joka säilyttäisi lähekkäin avaruuden etäisyyden perusteella lähekkäin olevat oliot. Hakuoperaatiot tarvitsevat nopean yhteyden tietyn avaruuden tilan dataolioihin. Levyhakujen nopeus on usein merkittävässä roolissa tällaisten kyselyjen suorittamisessa [GG98]. Ideaalissa tilanteessa vain ne levyn sivut, jotka kuuluvat tietokantaan kohdistuvan kyselyn vastaukseen tulisi hakea. Avaruuden etäisyyden perusteella lähekkäin sijaitsevat oliot tulisi tallentaa samalle levyn sivulle, jotta ne voitaisiin tehokkaasti hakea [ASI05]. Luvussa 2 käsitellään moniulotteisia hakemistoja. Tämän jälkeen esitellään luvussa 3 moniulotteinen hakemisto PN-puu ja sen käsittelyyn tarvittavat algoritmit. Luvussa 4 käydään läpi PN-puun tarvitsemat tietorakenteet.
2 Moniulotteiset hakemistot 2 Moniulotteiset hakemistot ovat tarkoitettu tietueille, joilla on useita attribuutteja, joiden mukaan tietueet halutaan indeksoida [ASI05]. Tällaisesta hakemistosta täytyisi pystyä hakemaan tietueita yhden tai useamman attribuutin perusteella. Hakemistojen ei myöskään tulisi suosia tiettyjä attribuutteja ellei tätä erikseen haluta. Moniulotteisella hakemistolla on yhtä monta ulottuvuutta kuin tietueella on attribuutteja. Tietyn pisteen koordinaattien arvot ovat suhteessa attribuuttien arvoihin. Moniulotteiset hakemistot voidaan jakaa kahteen luokkaan [GG98, ASI05]. Ensimmäisen luokan muodostavat hakemistot, jotka tallentavat vain yksittäisiä avaruuden pisteitä, joilla ei ole tilavuutta. Toisen luokan muodostavat hakemistot, joihin voidaan tallentaa tietyn avaruuden tilan käsittäviä olioita. Näitä olioita voivat olla viivat, monikulmiot tai muut tietyn avaruuden tilan rajaavat oliot. Tyypillisesti moniulotteiseen tietokantaan kohdistuvat haut muodostuvat pisteistä tai alueista. Haussa annettu piste voi olla kohta avaruudessa, jonka ympäristöstä etsitään olioita. Haussa annettu alue voi esim. rajata avaruuden osan, jonka sisältämät oliot halutaan löytää [GG98]. 3 PN-puu PN-puu (Projected Node tree) [ASI05] on tarkoitettu moniulotteisten pisteiden indeksointiin. Hakemisto pyrkii minimoimaan levylle kohdistuvia hakuja. PN-puu keskittyy hakuihin, joissa halutaan löytää ne tietueet, joiden attribuutit ovat halutulla etäisyydellä annetusta pisteestä. PN-puu tukee lisäyksiä ja poistoja, joita voidaan suorittaa hakujen välissä. PN-puu kasaa lähekkäiset pisteet yhdeksi solmuksi (node), joka tallennetaan yhdelle levyn sivulle. Solmun projektiot jokaiselle ulottuvuudelle tallennetaan omiksi
3 Kuva 1: Solmujen projektiot hakemistoiksi. PN-puu sisältää siis useita yksiulotteisia hakemistoja, joihin solmujen projektiot tallennetaan. Näiden lisäksi tarvitaan yksi moniulotteinen hakemisto, jonne tallennetaan jokaisen solmun keskipiste. Kuvassa 1 on esitetty kolme solmua ja näiden projektiot kahdelle ulottuvuudelle. Solmujen harmaa alue sisältää joukon solmuun kuuluvia pisteitä. Projektiot useammalle ulottuvuudelle suoritetaan vastaavalla tavalla. Koska jokainen ulottuvuus on tallennettu omaan yksiulotteiseen hakemistoon, voidaan haun suoritus jakaa rinnakkain suoritettaviin osiin helposti. Tällöin yksittäinen prosessori voi käsitellä yhden ulottuvuuden. Myös tuloksen hakeminen voidaan suorittaa rinnakkain, jos lähekkäin sijaitsevat solmut on tallennettu eri levyille. Solmujen keskipisteiden käsittelyyn käytetään neljää funktiota. Keskipisteet tallennetaan R-puuhun, ja haku R-puusta tapahtuu luvussa 4.2 kuvatulla tavalla. LisääKeskipiste(Solmu N, Piste C) lisää moniulotteiseen hakemistorakenteeseen uuden keskipisteen.
4 PoistaKeskipiste(Solmu N, Piste C) poistaa annetun pisteen hakemistosta. PäivitäKeskipiste(Solmu N, Piste vanhac, Piste uusic) korvaa vanhan keskipisteen uudella arvolla. HaeLähinNaapurisolmu(Piste P ) palauttaa solmun, jonka keskipiste on lähinnä annettua pistettä. Solmujen projektioiden käsittelyyn käytetään neljää funktiota. Jokainen projektio tallennetaan omaan B+-puuhun. Projektiota käsitellään luvussa 4.1. LisääProjektio(integer D, NodeId N, real alku, real loppu) lisää yhden projektion ulottuvuudelle D yksiulotteiseen hakemistoon. PoistaProjektio(integer D, NodeId N, real alku, real loppu) poistaa yhden projektion. PäivitäProjektio(integer D, NodeId N, real vanhaalku, real vanhaloppu, real uusialku, real uusiloppu) korvaa vanhat projektion alku- ja loppupisteet annetuilla uusilla arvoilla. HaeSolmutProjektioista(integer D, real alku, real loppu) palauttaa kaikki solmut, joiden projektiot ulottuvuudelle D ovat annetulla hakualueella. PN-puun tehokkuutta on verrattu hybridipuuhun [CM99], joka on tehokas moniulotteinen hakemistorakenne. PN-puun on osoitettu toimivan nopeammin suurilla aineistoilla ja suurilla etäisyyksillä hakupisteestä. 3.1 Lisäysalgoritmi Lisäysalgoritmi huolehtii, että lähekkäin sijaitsevat pisteet tallennetaan samaan solmuun. Tämä tapahtuu sijoittamalla lähekkäiset pisteet samaan solmuun ja jakamalla solmu ylivuodon tapahtuessa sopivalla tavalla.
5 Aluksi lisäysalgoritmissa etsitään solmu, jonka keskipiste on lähinnä lisättävää pistettä. Lähimmän keskipisteen hakuun käytetään moniulotteista hakemistoa, joka on esitelty luvussa 4.2. Haussa löydettyyn solmuun lisätään uusi piste. Jos löydettyyn solmuun ei enää mahdu uutta pistettä, tapahtuu solmun ylivuoto, ja solmu täytyy jakaa kahteen osaan. Muodostuneiden solmujen keskipisteet tulee tällöin laskea niiden sisältämistä pisteistä. Solmu jaetaan aina laajuudeltaan suurimman ulottuvuuden mukaan kahtia. Lisäksi katkaisukohtana käytettään solmun puoliväliä. Näin toimittaessa jako minimoi levyhakujen odotettua kestoa. Joissakin tilanteissa solmua ei voida jakaa tasan, jolloin toinen muodostuneista solmuista voi jäädä vajaaksi. Tällaiset tilanteet ovat kuitenkin harvinaisia ja ne eivät muodosta ongelmaa, jos sallitaan joidenkin solmujen täyttöasteen olla alle vaaditun. Lisätty solmu voi muuttaa solmun keskipistettä ja tämä täytyy laskea uudestaan. Jos solmu muodostaa uuden reunan projektioalueelle, täytyy solmun projektion rajoja päivittää. Algoritmi 1 kuvaa lisäysalgoritmin toimintaa. Algoritmi saa syötteenä lisättävän pisteen P. 3.2 Hakualgoritmi Hakualgoritmille annetaan parametrina yksi avaruuden piste ja etäisyys. Tällöin tulee löytää kaikki ne pisteet, jotka sijaitsevat annetun etäisyyden päässä halutusta pisteestä. Hakualgoritmi projisoi annetun haun jokaiselle ulottuvuudelle. Näin saatuja projektioita verrataan solmujen projektioihin ja ne solmut, jotka leikkaavat hakuprojektiota tallennetaan listoiksi. Jokaiselle ulottuvuudelle suoritetaan oma haku. Lopputulos muodostetaan näiden osatulosten leikkauksena. Leikkaus tapahtuu jakamalla listat
6 Algoritmi 1 LisääPiste(Piste P) N = HaeLähinNaapurisolmu(P) lisää P solmuun N if solmussa N tapahtuu ylivuoto then jaa N solmuiksi N1 ja N2 PoistaKeskipiste(N, N.Keskipiste) LisääKeskipiste(N1, Keskipiste(N1)) LisääKeskipiste(N2, Keskipiste(N2)) stop PäivitäKeskipiste(N, N.Keskipiste, Keskipiste(N)) for i = 1 to UlottuvuuksienMäärä do if P i < N.min i then PäivitäProjektio(i, N, N.min i, N.max i, P i, N.max i ) if P i > N.max i then PäivitäProjektio(i, N, N.min i, N.max i, N.min i, P i )
7 Algoritmi 2 HaeSolmut(Piste QP, integer R) for i = 1 to UlottuvuuksienMäärä Lista i = HaeSolmutProjektioista(i, QP i - R, QP i + R) d = UlottuvuuksienMäärä while d>1 do for i = 1 to (d div 2) Lista i = Leikkaus(Lista i, Lista i+(d+1)div2 ) d = (d + 1) div 2 Hae listassa List 1 olevat solmut levyltä pareiksi ja muodostamalla näiden parien leikkaukset. Tätä toistetaan kunnes jäljelle jää enää vain yksi lista. Jäljelle jäänyt lista kertoo ne solmut, jotka tulee hakea levyltä muistiin. Yksittäinen solmu kuuluu hakualueelle, jos sen kaikki projektiot leikkaavat haun projektiota jokaisessa ulottuvuudessa. Haussa voi muodostua myös vääriä positiivisia solmuja, joiden pisteet eivät kuulu hakualueelle, vaikka solmun projektiot kuuluvat. Väärät positiiviset lisäävät levyhakujen määrää ja vähentävät haun tehokkuutta. Jokainen ulottuvuus lisää tarvittavia levyhakuja yksiulotteisista hakemistoista. Väärien positiivisten levyhakujen määrä taas pienenee useammalla ulottuvuudella. Algoritmi 2 kuvaa hakualgoritmin toimintaa. Algoritmi saa syötteenä pisteen QP ja hakualueen säteen R.
8 3.3 Poistoalgoritmi Poistoalgoritmi etsii aluksi solmun, jonne poistettava piste kuuluu. Kun pisteen solmu löytyy, se poistetaan tästä solmusta. Pisteen poiston jälkeen täytyy solmun keskipistettä ja mahdollisesti projektioita päivittää. Jos solmun täyttöaste laskee alle halutun rajan, täytyy koko solmu poistaa ja sen sisältämät pisteet lisätä tietorakenteeseen uudestaan. Tällöin solmujen täyttöaste ei laske alle halutun rajan. Kokeellisesti on hyväksi täyttöasteen minimirajaksi todettu 40% solmun tallennustilavuudesta. Yleensä PN-puun täyttöaste todellisilla aineistoilla on noin 75%. Algoritmi 3 kuvaa pisteen poistoalgoritmia ja saa syötteenä poistettavan pisteen P. Solmun poistaminen on kuvattu algoritmissa 4. Tällöin syötteenä on poistettava solmu N. Solmun poistaminen tapahtuu poistamalla solmun keskipiste ja kaikki sen projektiot. 4 PN-puun toteutus PN-puu käyttää useampaa eri tietorakennetta. Luvussa 4.1 käsitellään projektioiden tallennukseen tarvittavia yksiulotteisia rakenteita ja luvussa 4.2 lähimmän naapurin löytämiseen tarkoitettua rakennetta. 4.1 Projektioiden tallentaminen PN-puu käyttää yksiulotteisia hakemistoja tallentamaan solmujen projektioita [ASI05]. Mitä hyvänsä yksiulotteista hakemistorakennetta voidaan käyttää näiden hakemistojen toteutukseen. PN-puun yksiulotteiseksi hakemistorakenteeksi on valittu B+puu. B+-puun valintaan on päädytty, koska se on tehokas ja se löytyy useasta tie-
9 Algoritmi 3 PoistaPiste(Piste P) N = HaeSolmu(P) poista piste P solmusta N if N.PisteidenMäärä < minimi then PoistaSolmu(N) and stop PäivitäKeskipiste(N, N.Keskipiste, Keskipiste(N)) for i = 1 to UlottuvuuksienMäärä if P i = N.min i then hae jäljelle jääneistä pisteistä pienin alaraja LB PäivitäProjektio(i, N, N.min i, N.max i, LB, N.max i ) else P i = N.max i then hae jäljelle jääneistä pisteistä suurin yläraja UB PäivitäProjektio(i, N, N.min i, N.max i, N.min i, UB) Algoritmi 4 PoistaSolmu(Solmu N) PoistaKeskipiste(N, N.Centroid) for i = 1 to UlottuvuuksienMäärä PoistaProjektio(i, N, N.min i, N.max i ) for i = 1 to N.PisteidenMäärä LisääPiste(N[i])
10 tokannan hallintajärjestelmästä. Yksittäisen ulottuvuuden projektioiden alkupisteet ja loppupisteet on suositeltu tallennettavaksi erillisiin B+-puihin. Projektioiden alkupisteet on järjestetty kasvavaan järjestykseen. Aluksi haetaan ensimmäinen arvo, joka on suurempi kuin hakualueen loppu. Tämän jälkeen voidaan projektioista karsia tämä arvo ja kaikki tätä arvoa seuraavat arvot. Vastaavasti karsinta suoritetaan projektioiden loppupisteille. Loppupisteet on järjestetty laskevaan järjestykseen. Jäljelle jäävät projektiot ovat ne, jotka muodostavat hakualueen projektiot. 4.2 Lähimmän naapurin etsintä PN-puu käyttää lähimmän solmun keskipisteen löytämiseen moniulotteista hakemistoa. PN-puu tallettaa hakurakenteeseen vain yksittäisiä pisteitä, jotka kuvaavat solmujen keskipisteitä. Käytetty hakemisto on R-puun läpikäyntiin perustuva lähimmän naapurin etsintäalgoritmi [ASI05]. R-puu on muunnos B-puusta useammalle ulottuvuudelle [RKV95]. R-puu on samalla tavalla tasapainotettu puu kuin B-puu ja rakentuu pitkälle samalla tavalla. Tallennettavat avaimet kuvaavat nyt kuitenkin avaruuden osia. Jokainen yksittäinen tietorakenteeseen tallennettu olio rajataan pienimmän sitä rajaavan moniulotteisen suorakaiteen sisälle. Tämä kuvaa sitä avaruuden osaa, jonka sisälle olio jää kokonaisuudessaan. R-puun lehtiin tallennetaan tämä suorakaide ja viittaus olion tunnisteeseen. Tilan rajaava suorakaide vastaa B-puun avainta. Puun sisäsolmut sisältävät vastaavia suorakaiteita, jotka rajaavat suorakaiteen sisälle kuuluvat lapset. Jokaisesta suorakaiteesta on myös yhteys sen lapsiin. Lähimmän naapurin löytäminen R-puusta tapahtuu syvyyssuuntaisella järjestetyllä puun läpikäynnillä [RKV95]. Haku aloitetaan puun juuresta. Haun edetessä karsitaan turhia puun haaroja käyttäen kahta etäisyysarviota hyväksi. Toinen etäisyyk-
11 sistä kuvaa optimistista etäisyyttä lähimpään naapuriin ja toinen pessimististä etäisyyttä. Näitä arvoja päivitetään haun edetessä. Molemmat etäisyydet perustuvat avaruutta rajaavien suorakaiteiden ominaisuuksiin ja näistä tehtäviin päätelmiin. Näillä arvioilla voidaan turhien etsintähaarojen määrää karsia huomattavasti, ja haku on tehokas. 5 Yhteenveto PN-puu on tarkoitettu moniulotteisten hakemistojen toteuttamiseen. Hakemistorakenne pystyy hyödyntämään useita prosessoreja, koska jokainen ulottuvuus voidaan käsitellä omana kokonaisuutena. PN-puun lisäysalgoritmi huolehtii siitä, että avaruudessa lähekkäin olevat pisteet päätyvät samaan solmuun. PN-puusta voidaan hakea pisteen ympäristössä olevat pisteet, jotka ovat halutulla etäisyydellä annetusta pisteestä. Uusien pisteiden lisäämistä ja vanhojen poistamista voi tehdä hakujen välillä tietorakenteen tehokkuuden siitä kärsimättä. Lähteet ASI05 Ali, M. H., Saad, A. A. ja Ismail, M. A., The pn-tree: A parallel and distributed multidimensional index. Distributed and Parallel Databases, 17,2(2005), sivut 111 133. CM99 Chakrabarti, K. ja Mehrotra, S., The hybrid tree: An index structure for high dimensional feature spaces. Proc. 15th International Conference on Data Engineering, Washington, DC, USA, 1999, IEEE Computer Society, sivut 440 447.
GG98 Gaede, V. ja Günther, O., Multidimensional access methods. ACM Computing Surveys, 30,2(1998), sivut 170 231. 12 RKV95 Roussopoulos, N., Kelley, S. ja Vincent, F., Nearest neighbor queries. Proc. 1995 ACM SIGMOD international conference on Management of data, New York, NY, USA, 1995, ACM Press, sivut 71 79.