HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Paikkatiedon käsittely 5. Paikkatiedon indeksointi Antti Leino antti.leino@cs.helsinki.fi 29.1.2007 Tietojenkäsittelytieteen laitos
Mistä on kyse? Indeksoinnin tarkoituksena on nopeuttaa tietokantahakuja Perinteisessä tietokannassa indeksointi perustuu hakuavaimeen Avainkentässä oltava arvo Eri tietueilla eri avaimet Muillekin kentille voi tehdä indeksejä Arvo voi olla tyhjä Indeksi antaa viitteen osumatietueiden hakuavaimiin Hakuehtona tyypillisesti yhtäsuuruus tai arvoväli
Järjestys Tavanomaisten relaatiotietokannan tietotyyppien arvoalue on täysin järjestetty On olemassa relaatio a,b : (a b) (b a) a,b,c : (a b) (b c) a c a,b : (a b) (b a) a = b Indeksin rakentaminen täysin järjestetyille tietotyypeille on ollut tunnettua jo pitkään Tavanomainen ratkaisu B-puu
B-puu Kohteen löytämiseen riittää tasan yhden polun kulkeminen Kaikki polut juuresta lehtiin yhtä pitkiä Jokainen sivu (paitsi juuri) aina vähintään puolillaan Puun koko O(n) Haku, lisäys ja poisto vievät O( log n) ajan
Mutta kun ei B-puu sopii mainiosti täysin järjestetyn datan indeksointiin Paikkatieto ei olekaan Mikä neuvoksi? Laaditaan 2-ulotteiselle tiedolle 1-ulotteinen järjestys Yleistetään B-puu sellaisen aineiston indeksointiin, joka ei ole tällä tapaa järjestetty Käytännössä jälkimmäinen vaihtoehto yleensä parempi
Ratkaisu 1: tilan täyttävät käyrät Käyrä, jonka fraktaalidimensio = 2 Jatkuva käyrä, joka täyttää koko avaruuden Ensimmäisenä esitteli Giuseppe Peano (1890) Yleisesti käytössä David Hilbertin (1891) esittämä Verraten yleinen myös Z-käyrä (useita riippumattomia esittäjiä 1980-luvulla)
Miksi tilan täyttävä käyrä? Linearisoi moniulotteisen avaruuden Tämän jälkeen indeksointi helppoa Toivottavia ominaisuuksia: Lähekkäisyyden säilyminen: jos pisteet lähellä toisiaan 2-ulotteisessa avaruudessa, lähekkäin myös käyrällä Helppo muunnos 2- ja 1-ulotteisten koordinaattien välillä Nämä ominaisuudet ikävä kyllä ristiriitaisia Hilbertin käyrä säilyttää lähekkäisyyden melko hyvin Z-käyrällä pisteen sijainti on helposti laskettavissa koordinaateista
Z-järjestys Rasteripisteen järjestysnumero helposti laskettavissa Bittilimitys: otetaan bittejä vuorotellen (binäärimuotoisesta) x- ja y-koordinaatista Esimerkiksi (2 10,1 10 ) = (10 2,01 2 ) 1001 2 = 9 10
Indeksointi z-järjestyksen avulla Indeksointiavaimena näppärä käytää alkupään bittejä Tyhjä jono: koko avaruus Parillinen määrä bittejä = neliö Pariton määrä bittejä = kaksi päällekkäistä neliötä Kaikkia suorakulmioita ei voi esittää
Kohteen approksimointi Aluekohde approksimoidaan niiden Z-arvojen joukkona, jotka yhdessä kattavat kohteen Tässä siis {0011, 001, 0110, 100, 110000} Approksimaation rakeisuus käy suoraan ilmi pisimmän z-arvon pituudesta
Z-approksimoinin ominaisuuksia Alue, jonka z-arvo on z a sisältyy alueeseen, jonka z-arvo on z b, täsmälleen silloin, kun z b on z a :n alkuosa Z-arvojen aakkosjärjestys = niiden osoittamien alueiden järjestys z-käyrällä Peräkkäisten Z-arvojen osoittamat alueet voivat olla kaukana toisistaan
Kysely z-approksimoidusta indeksistä Tehtävä: haetaan kohteet, jotka ovat hakuehtonelikulmion kattamalla alueella Haetaan indeksisolmut, jotka kattavat hakuehdon Aloita avaruuden alkupisteestä Etsi ensimmäinen hakunelikulmioon osuva z-arvo ja lisää indeksisivu hakutulokseen Jatka hakua ensimmäisestä tämän sivun jälkeisestä z-arvosta
Z-alueiden haku Hakuehto: (2 x 5) (1 y 5) Haetaan ensimmäinen piste, joka on hakualueella Haetaan vuorotellen ensimmäinen kulloisenkin indeksiruudun jälkeinen piste, joka on hakualueella Nämä määrittävät indeksiruudut, joita hakualue leikkaa: {0010, 0011, 0110, 10000, 100011, 1001, 1100}
Seuraavan osuman etsintä Lähtötilanne: ollaan hakualueen ulkopuolella Etsi merkitsevin muutettava bitti Jos se muuttuu 1 0, ollaan tässä suunnassa alueen yläpuolella Valitse muista koordinaateista vähiten merkitsevä äskeistä merkitsevämpi bitti, jota voidaan kasvattaa joutumatta alueen ulkopuolelle Jos se muuttuu 0 1, ollaan alueen alapuolella Valitse tämä bitti Aseta valittu bitti 1:ksi Nollaa kaikki vähemmän merkitsevät bitit Kasvata kunkin koordinaatin tuottamia bittejä, kunnes piste on hakualueella
Seuraavan osuman etsintä: esimerkki (000,000) (010,000) (010,001) = 001001 (010,010) = 001100 hakualueella (000,100) (010,100) = 011000 (010,110) (100,000) (100,001) = 100001 (101,000) (101,001) = 100011 (100, 010) = 100100 hakualueella (110,000) (100,100) = 110000
Hilbertin käyrä Vierekkäiset käyrän pisteet ovat vierekkäisiä myös lähtöavaruudessa Mahdollistaa hiukan monipuolisemman lohkojaon Toisaalta pisteen sijainnin laskeminen monimutkaista Perusalgoritmi puurakenteen avulla
Sijainti Hilbertin käyrällä Laskettavissa puun avulla: joka tasolla jaetaan jäljellä oleva alue neljään osaan Puurakenteen käyttö algoritmin osana hankalaa Tasojen määrän lisääminen kasvattaa puun kokoa
Sijaintipuu tilakoneena Sijaintia Hilbertin käyrällä osoittava puu esitettävissä myös tilakoneena Melko pian tilakoneen koko jää puun kokoa pienemmäksi
Esimerkki pisteen sijainnin laskennasta Koordinaattien 1. bitit (1, 0), so. oikea alaneljännes Juurisolmusta saadaan avaimen biteiksi 11 Siirrytään puussa 2. tasolle (1, 0):n osoittamaa haaraa Koordinattien 2. bitit (1, 1), so. oikea yläneljännes Tästä solmusta saadaan avaimen biteiksi 00 Ollaan lehtisolmussa, avain 1100 2 = 12 10
Kysely Hilbertin käyrään perustuvasta indeksistä Tehtävänä etsiä ne hakemistosivut, jotka hakualue leikkaa Hakemiston sivut eivät välttämättä nelikulmioita Perusalgoritmi kuten z-käyrän tapauksessa Seuraavan osuman etsintä erilainen
Seuraavan osuman etsintä Hiukan hankalahkoa, koska käyrä erisuuntainen eri puolilla Iteratiivisesti: joka kierroksella rajoitutaan pienempään alipuuhun Rajoitetaan etsintä niihin alipuihin, jotka leikkaavat hakualueen Jokaisen iteraatiokierroksen lopussa katsotaan, oliko löydetty osuma aiemmin käyrällä kuin edellisillä kierroksilla löydetty Jos osumia ei löytynyt, kiivetään puussa ylöspäin, kunnes löytyy Jos tämäkään ei auta, seuraavaa osumaa ei ole
Osuman etsintä: esimerkki Ensimmäinen osuma: Löydetään vasen alaneljännes: avaimeen 00 Sen oikea yläneljännes: avaimeen 10 0010 Tämä sisältyy kokonaan hakualueeseen: valitaan sen ensimmäinen piste 001000 2 = 8 10 Osuma sisältyy sivuun 1, joka käsittää Hilbertin käyrän pisteet 0 17
Ratkaisu 2: R-puut Peruslähtökohta: modifioidaan B-puuta Tavoitteena indeksirakenne, joka toimii n-ulotteisella datalla, missä n > 1 Kutakin kohdetta approksimoidaan sen minimisuorakulmiolla (minimum bounding rectangle, MBR) Koordinaattiakselien suuntainen Helppo muodostaa: kohteen nurkkapisteiden kustakin koordinaatista pienin ja suurin Minimisuorakulmioiden keskinäiset suhteet helppo laskea
R-puu»Suorakulmiopuu» (rectangle tree) Tasapainoinen puu Lehtisivuissa (MBR, oid), missä oid on kohteen tunniste ja MBR sen minimisuorakulmio Muissa solmuissa (DR, p), missä p on lapsisivu ja DR suorakulmio, joka peittää kaikki p:stä alkavan alipuun kohteet Suorakulmiot voivat mennä osittain päällekkäin
R-puu
R-puun ominaisuuksia Kaikki polut juurista lehtiin yhtä pitkiä Juurta lukuunottamatta kussakin solmussa enintään M ja vähintään m tietuetta, missä m M/2 Jos juuri ei ole samalla lehti, siinä on vähintään kaksi tietuetta Kaikki lehdet ovat samalla tasolla Puun korkeus enintään log m N +1
Haku R-puusta Haarautumasolmussa: käy läpi kaikki solmun tietueet Jos tietueen minimisuorakulmio leikkaa hakualuetta, hae edelleen tästä alipuusta Lehtisolmussa: käy läpi kaikki solmun tietueet Jos tietueen minimisuorakulmio leikkaa hakualuetta, lisää tietue hakutulokseen
Esimerkkihaku R-puusta Juuren lapsista a, b ja d leikkaavat hakualueen a:n lapsista kohteet 7, 11 ja 16 leikkaavat b:n lapsista kohde 2 leikkaa d:n lapsista kohde 10 leikkaa Kohteet 2, 7, 10, 11 ja 16 leikkaavat hakualueen
Kohteen lisäys R-puuhun Aloita juuresta Valitse kulloisenkin solmun lapsista sopiva alipuu, kunnes olet lehtisolmussa Jos solmu ei ole täysi, lisää solmu siihen Jos solmu on täysi, halkaise se Järjestä puu uudelleen tästä solmusta ylöspäin
Alipuun valinta Etsi ne solmun lapset, joiden suorakulmiota kohteen lisääminen kasvattaisi vähiten Jos tällaisia lapsia löytyi vain yksi, valitse se Jos tällaisia löytyi useita, valitse se, jonka oma suorakulmio on pienin
Puun uudelleenjärjestäminen Lähde liikkeelle vasta lisätystä solmusta Päivitä sen äitisolmussa näkyvä minimisuorakulmio kattamaan solmuun nyt kuuluvat kohteet Järjestä uudelleen puu äitisolmusta ylöspäin
Solmun halkaiseminen Jaa halkaistavan solmun alkiot ja lisättävä uusi alkio kahdeksi solmuksi Lisää näin syntynyt uusi solmu alkuperäisen äitisolmuun Jos äitisolmu oli täynnä, halkaise sekin Päivitä halkaistujen solmujen suorakulmiot
Solmun halkaisutavan valinta Perustavoite: minimiotava todennäköisyys, että pitäisi tutkia molemmat alipuut Tämä riippuu siitä, leikkaako solmun minimisuorakulmio hakualuetta Siispä minimoitava sekä suorakulmioiden yhteenlaskettu ala että niiden leikkauksen ala Nämä vaatimukset joskus ristiriitaiset
Solmun halkaisutavan valinta Valitse uusien solmujen siemeniksi se alkiopari, jonka kattavassa suorakulmiossa on mahdollisimman paljon tyhjää tilaa Jaa muut alkiot solmuihin: Jos jäljellä on niin vähän alkioita, että ne on lisättävä jompaankumpaan uusista solmuista, lisää ne sinne Muutoin valitse alkio, joka kasvattaisi jommankumman solmun alaa vähiten ja lisää se sinne. Aikavaativuus O (N 2 ) Olemassa myös lineaarisessa ajassa toimiva algoritmi, mutta sen jako ei yhtä hyvä
Kohteen poistaminen R-puusta Kohdetta poistettaessa on pidettävä huoli siitä, että puu pysyy tasapainossa Jos kohteen sisältävä solmu kutistuisi liiaksi, puu on tiivistettävä Etsi lehti Poista kohde siitä Järjestä uudelleen puu tästä solmusta ylöspäin Tiivistä puu tarvittaessa
Lehden etsiminen Jos ollaan haarautumasolmussa, jatka hakua kaikista niistä lapsisolmuista, joiden suorakulmiot kattavat kohteen Jos ollaan lehtisolmussa, johon kohde kuuluu, totea lehden löytyneen
Puun tiivistys kohteen poiston jälkeen Poista vajaat solmut puusta: Jos ei olla juuressa ja solmun koko < m, Merkitse solmun kaikki lapset orvoiksi Poista solmu äidistään Järjestä uudelleen puu äidistä alkaen Tee sama vajaiden solmujen poisto-operaatio äidille Lisää orvot solmut puuhun
Kohteiden lisäysjärjestys R-puun avulla toteutetun hakemiston tehokkuus riippuu kohteiden lisäysjärjestyksestä Huonossa järjestyksessä lisätyt kohteet tuottavat huonon hakemiston Ratkaisu: R*-puu
R*-puu R-puun muunnelma, jossa hiukan erilainen algoritmi solmun halkaisuun Tavoitteena minimoida Solmujen päällekkäisyys Solmun peittämä pinta-ala Solmun kattaman suorakulmion reuna Myös tallennustilan käyttö Tietorakenteet ja hakualgoritmit samat kuin R-puussa
Solmun halkaisu R*-puussa R-puu lähtee rakentamaan uusia solmuja kahden toisistaan kauimpana olevan alkion ympärille R*-puu jakaa alkiojoukon koordinaattiakselin suuntaisesti Joukko jaetaan kunkin akselin suuntaisesti kahtia niin, että kummankin puoliskon koko m Näistä jaoista valitaan paras Jaettavat kohteet R-puu R*-puu
Kohteen lisäys R*-puuhun Halkaisualgoritmin lisäksi toinen parannus Ennen halkaisua sijoitetaan sen»huonoimmat» alkiot uudelleen Lasketaan kunkin alkion keskipiste Lasketaan sen etäisyys solmun minimisuorakulmion keskipisteestä Poistetaan puusta ne 30 % solmuista, joilla tämä etäisyys on pisin Lisätään ne uudelleen Jos sama solmu vuotaa yli toisen kerran saman kohteenlisäysoperaation aikana, se halkaistaan
Pakotettu uudelleenlisäys Uudelleenlisäys korjaa huonon lisäysjärjestyksen vaikutusta Lähtötilanne Ylivuoto R-puu R*-puu
R+-puu Saman tason solmujen suorakulmiot erillisiä Haarautumasolmun minimisuorakulmio kattaa sen lapsisolmujen minimisuorakulmiot Lehtisolmun suorakulmio joko sisältää kohteen minimisuorakulmion tai leikkaa sitä Kukin avaruuden piste yhden polun kautta Aluekyselyissä etu ei välttämättä aivan selvä Puun koko suurempi kuin R- ja R*-puissa Hakutuloksen jälkikäsittelyssä varmistettava, että kukin kohde mukana korkeintaan kerran
GiST: yleistetty hakupuu Tavoitteena yleiskäyttöinen hakupuu: sama toiminnallisuus kuin B- ja R-puilla ja vielä lisääkin B-puusta tuttuja ominaisuuksia Juurisolmussa on vähintään kaksi alkiota, ellei se ole myös lehti Juurta lukuun ottamatta solmussa m M alkiota, missä m on välillä 2 M 2 Kaikki lehdet ovat samalla tasolla Viimeistään R-puusta tuttua Lehtisolmun alkioon liittyy ehto p, joka pätee solmun osoittamaan tietokantamonikkoon
GiST-puun uutuus Haarautumasolmun alkioon liittyy ehto p, joka pätee koko alipuuhun mutta alipuun solmuissa olevalle ehdolle p ei välttämättä päde p p Väljempi muotoilu kuin aiemmissa puissa Riittää, että ehto erottaa samasta solmusta alkavat alipuut toisistaan Ylemmillä tasoilla käytetyt ehdot pätevät koko alipuuhun, joten niitä ei enää tarvitse toistaa
GiST-puun määrittely Puussa esitettävältä olioluokalta edellytetään kuutta metodia Consistent (E,q): epätosi, jos ehto q ja solmussa E oleva ehto eivät voi päteä yhtä aikaa Union (P): palauttaa predikaatin r, joka pätee kaikille joukkoon P kuuluvista solmuista alkaville alipuille Compress (E): palauttaa alkion E, jossa oleva ehto on jollakin tapaa pakattu alkion E ehdon esitys Decompress (E): palauttaa jonkin sellaisen alkion E, että Compress (E ) = E
GiST-puun määrittely, osa 2 Penalty (E 1,E 2 ): palauttaa kustannuksen E 1 :n lisäämisestä alipuuhun, jonka juuri on E 2 Käytetään alkion lisäyskohdan ja solmun halkaisusuunnan määrittämiseen Esim. R-puussa Penalty (E 1,E 2 ) = area ( mbr (E 1 E 2 )) area ( mbr (E 1 )) PickSplit (P): jakaa alkiojoukon kahteen vähintään m alkiota sisältävään osaan Jakokriteeri usein sukua Penalty :lle Ei kuitenkaan välttämättä
Haku GiST-puusta Lehtisolmussa käy läpi kaikki sen alkiot Jos Consistent (alkio, hakuehto), lisää alkio hakutulokseen Haarautumasolmussa käy läpi kaikki sen alkiot Jos Consistent (alkio, hakuehto), hae edelleen siitä alkavasta alipuusta Lineaariselle datalle tehokkaampi B-puumainen haku Kohteen lisäys ja solmun halkaisu vastaavilla algoritmeilla kuin R-puussa
Entä meillä? PostgreSQL:ssä toteutettu B-, R- ja GiST-puu Periaatteessa B-/R-puu yhtä tehokas kuin vastaava GiST-puu Käytännössä otettava huomioon toteutuksen tehokkuus Perinteiset tietotyypit kannattaa indeksoida B-puun avulla Paikkatiedon indeksointiin GiST parempi kuin R-puu