You are on page 1of 31

12/12/2007

INDEKSIRANJE I PROSTORNI UPITI U ORACLE SPATIAL

Sadraj
Indeksiranje prostornih podataka Upiti nad prostornim podacima Primeri indeksiranja i prostornih upita nad bazom podataka za katastar

12/12/2007

Indeksiranje prostornih podataka


Prostorni indeks obezbeuje mehanizam da ogranii pretragu. Ovaj mehanizam je baziran na prostornim kriterijumima kao to su presek i sadravanje. Prostorni indeks je neophodan da:
Pronae objekte unutar indeksiranog prostora podataka koji interaguju sa datom takom ili povrinom od interesa (prostorni upit spatial query, query window). Pronae parove objekata iz dva indeksirana prostora podataka koji prostorno interaguju jedan sa drugim (prostorni spoj spatial join).

Oracle Spatial koristi indeksiranje pomou R-stabla. Indeksiranje pomou R-stabla pokazuje znaajno poboljanje performansi.

Indeksiranje pomou R stabla


Indeks u strukturi R-stabla (u daljem tekstu R-tree indeks) moe da indeksira prostorne podatke do etiri dimenzije. R-tree indeks aproksimira svaku geometriju jednim pravougaonikom koji minimalno obuhvata tu geometriju (on se naziva minimalni obuhvatajui pravougaonik Minimum Bounding Rectangle, u daljem tekstu MBR)

12/12/2007

Kvalitet R stabla
Na smanjenje kvaliteta R stabla utie veliki broj INSERT, UPDATE i DELETE operacija koje utiu na R-tree indeks. Smanjenje kvaliteta R stabla izaziva smanjenje performansi prilikom postavljanja prostornih upita.

Procena kvaliteta R stabla


R stablo je hijerarhijska struktura iji su vorovi na razliitim nivoima. Performanse indeksne strukture u vidu R stabla za upite su grubo proporcionalne povrini i perimetru vorova R stabla. Povrina pokrivena na nivou 0 predstavlja povrinu koju obuhvata MBR geometrija samih podataka, povrina na nivou 1 predstavlja povrinu koju obuhvataju listovi R stabla itd. Prvobitni odnos povrine pri korenu (najvii nivo) i povrine na nivou 0 se moe menjati tokom vremena zbog auriranja tabele, i ako postoji degradacija tog odnosa (tj ako se znaajno povea), ponovne izgradnje indeksa (rebuilding) moe poboljati performanse upita, upotrebom ALTER INDEX REBUILD iskaza.

12/12/2007

Kreiranje prostornog indeksa [1/2]


Pre postavljanja prostornih upita obavezno je kreirati prostorni upit nad SDO_GEOMETRY kolonom. Sintaksa za kreiranje prostornog indeksa je: CREATE INDEX naziv_indeksa ON naziv_tabele (naziv_geom_kolone) INDEXTYPE IS MDSYS.SPATIAL_INDEX; Prostorni indeks se kreira nakon unoenja metapodataka vezanih za tabelu u USER_SDO_GEOM_METADATA pogled i unoenja prostornih podataka u tabelu.

Kreiranje prostornog indeksa [2/2]


Ako kreiranje indeksa nije kompletno iz bilo kog razloga, indeks nije validan i mora se izbrisati DROP INDEX <index_name> [FORCE] iskazom. Prostorni indeksi se mogu kreirati na dve, tri ili etiri dimenzije podataka. Podrazumevani broj dimenzija je dve, ali ako podaci imaju vie od dve dimenzije, moe se koristiti sdo_indx_dims kljuna re da specificira broj dimenzija na kojima treba da se kreira indeks. Ako je prostorni indeks kreiran na vie od dve dimenzije sloja, jedini prostorni operator koji se moe koristiti u datom sloju je SDO_FILTER (primarni filter) koji uzima u obzir sve dimenzije. Ostali prostorni operatori su onemogueni ako je indeks izgraen na vie od dve dimenzije.
Geodetski podaci (lat/lon) se moraju indeksirati geodetskim R-tree indeksom.

12/12/2007

Ograniavanje podataka na odreeni tip geometrije


Ograniavanje podataka na odreeni tip geometrije se moe izvriti prilikom kreiranja ili ponovne izgradnje prostornog indeksa (rebuild). Specificirati tip geometrije je obavezan u toj tabeli.
Ovo se postie kljunom rei layer_gtype u PARAMETERS klauzuli iskaza CREATE INDEX ili ALTER INDEX REBUILD i specificiranjem vrednosti odgovarajue geometrije (POINT, LINE, CURVE, POLYGON, COLLECTION, MULTIPOINT, MULTILINE, MULTICURVE, MULTIPOLYGON). Primer: CREATE INDEX parcela_ind ON parcela(geometrija) INDEXTYPE IS MDSYS.SPATIAL_INDEX PARAMETERS ('layer_gtype=POLYGON');

Sadraj
Indeksiranje prostornih podataka Upiti nad prostornim podacima Primeri indeksiranja i prostornih upita nad bazom podataka za katastar

12/12/2007

Model upita
Oracle Spatial koristi dvoslojni model upita sa operacijama primarnog i sekundarnog filtera da bi razreio prostorne upite i prostorne spojeve. Termin se koristi da indicira da se dve razliite operacije izvode za svaki pojedinani upit. Rezultat ove dve kombinovane operacije je taan rezultujui skup datog upita. Ove dve operacije se nazivaju primarni i sekundarni filter.

Primarni i sekundarni filter


Primarni filter omoguuje brzu selekciju kandidata datog upita koje zatim prosleuje sekundarnom filteru. Primarni filter uporeuje aproksimacije geometrija da bi smanjio kompleksnost izraunavanja i smatra se manje zahtevnim filterom. S obzirom da primarni filter uporeuje aproksimacije geometrija, on vraa nadskup tanog rezultujueg skupa. Sekundarni filter primenjuje tana izraunavanja na geometrijama koje su rezultat primarnog filtera. Sekundarni filter daje taan odgovor na prostorni upit. On je zahtevan u pogledu izraunavanja, ali se primenjuje samo na rezultat primarnog filtera, a ne na celokupan skup podataka.

12/12/2007

Prostorne relacije i filtriranje


Oracle Spatial koristi sekundarne filtere da bi odredio prostorne relacije izmeu entiteta u bazi podataka. Prostorne relacije su bazirane na geometrijskim lokacijama. Najee prostorne relacije su bazirane na topologiji i razdaljini. Razdaljina izmeu dva prostorna objekta je minimalna razdaljina izmeu bilo koje dve njihove take. Za dva objekta se kae da su unutar date razdaljine jedan u odnosu na drugi, ako je njihova razdaljina manja od date razdaljine.

Primarni filter operator SDO_FILTER


Operator SDO_FILTER implementira primarni filter, odnosno prvi deo dvokoranog procesa izvravanja upita u Oracle Spatial. Primarni filter koristi indeksirane podatke samo da odredi da li parovi objekata mogu interagovati. Primarni filter proverava da li minimalni pravougaonici (MBR) objekata kandidata interaguju, a ne da li sami objekti interaguju.

12/12/2007

Sintaksa operatora SDO_FILTER


SDO_FILTER(geometry1 SDO_GEOMETRY, geometry2 SDO_GEOMETRY, param VARCHAR2)
geometry1 je kolona tipa SDO_GEOMETRY u tabeli. Ova kolona mora biti prostorno indeksirana. geometry2 je objekat tipa SDO_GEOMETRY. Ovaj objekat moe ali ne mora biti iz tabele, a ako dolazi iz tabele moe ali ne mora biti prostorno indeksiran. param je opcioni string tipa VARCHAR2. On moe da specificira bilo koju ili obe kljune rei min_resolution i max_resolution.

Izraz SDO_FILTER(geometry1,geometry2) = 'TRUE' dodeljuje TRUE za parove objekata koji nisu nepovezani (disjoint), a inae dodeljuje FALSE.

Kljune rei min_resolution i max_resolution


Kljuna re min_resolution specificira da treba ukljuiti samo geometrije ija bar jedna strana minimalnog poligona (MBR) je vea ili jednaka od navedene vrednosti. Primer: min_resoultion=25 ukljuuje samo geometrije iji MBR ima irinu ili duinu (ili oboje) najmanje 25. Slino je sa kljunom rei max_resolution, koji ukljuuje samo geometrije ija je jedna strana MBR manja ili jednaka od navedene vrednosti. Cilj ovih kljunih rei je da iskljue geometrije koje su premale ili prevelike da bi bile od interesa. Ovo znaenje kljunih rei min_resolution i max_resolution je isto za sve operatore koji ih koriste.

12/12/2007

Nain korienja operatora SDO_FILTER


SDO_FILTER je jedini operator koji se moe koristiti sa podacima koji su indeksirani na vie od dve dimenzije. Operator razmatra sve dimenzije specificirane u prostornom indeksu. Operator se uvek mora koristiti u WHERE klauzuli, a uslov koji ukljuuje operator mora biti u formi SDO_FILTER(arg1, arg2) = 'TRUE'. geometry2 moe poticati iz tebele ili biti tranzijentni SDO_GEOMETRY objekat, ako nije prostorno indeksiran, operator ga indeksira i postiu se dobre performanse; ako se dve ili vie geometrija iz geometry2 prosleuju operatoru, ORDERED optimizer hint mora biti specificiran, i tabela u geometry2 mora biti prva specificirana u FROM klauzuli. Ako su geometry1 i geometry2 bazirani na razliitim koordinatnim sistemima geometry2 se privremeno transformie u koordinatni sistem geometry1 da bi se izvela operacija.

Prostorni operatori koji implementiraju sekundarni filter


Da bi se odredile prostorne relacije, Oracle Spatial ima nekoliko metoda sekundarnog filtera:
SDO_RELATE operator procenjuje topoloke kriterijume. SDO_WITHIN_DISTANCE operator odreuje da li su dva prostorna objekta meusobno unutar specificirane razdaljine. SDO_NN operator identifikuje najblie susede za prostorne objekte.

12/12/2007

Operator SDO_RELATE
SDO_RELATE operator implementira devetopreseni (nine-intersection) model za kategorizaciju binarnih topolokih relacija izmeu taaka, linija i poligona. Svaki prostorni objekat ima:
unutranjost (interior), granicu (boundary), spoljanjost (exterior).

Granice objekata
Granica se sastoji od taaka ili linija koje razdvajaju unutranjost od spoljanjosti. Granica linije se sastoji od njenih krajnjih taaka, meutim ako se one poklapaju (tj ako su ista taka), linija nema granicu. Granice multilinije su krajnje take svih linija komponenata, meutim ako se one poklapaju, samo kranje take koje se poklapaju neparan broj puta su granice. Granica poligona je linija koja opisuje njegov perimetar (obim). Unutranjost se sastoji od taaka koje su u objektu ali ne i na njegovoj granici, a spoljanjost se sastoji od taaka koje ne pripadaju objektu.

10

12/12/2007

Devetopreseni (Nine-intersection) model


Objekat A ima tri komponente:
granica Ag, unutrnjost Au i spoljonjost As

Svaki par objekata ima devet moguih preseka izmeu njihovih komponenti. Parovi komponenti imaju kao rezultat preseka:
prazan (0) skup ili neprazan (1) skup.

Skup preseka izmeu dve geometrije je predstavljen pomou devetopresene matrice koja specificira koji parovi komponenti se seku a koji ne.

"101001111".

Topoloke relacije
DISJOINT: nepovezani granice i unutranjost se ne seku. TOUCH: dodiruje granice se seku ali se unutranjosti ne seku. OVERLAPBDYDISJOINT: preklopljen bez presecanja granica unutranjost jednog objekta preseca granicu i unutranjost drugog objekta, ali im se granice ne seku. Primer ove relacije je kada linija poinje izvan poligona a zavrava unutar poligona. OVERLAPBDYINTERSECT: preklopljen sa presecanjem granica granice i unutranjosti dva objekta se seku. EQUAL: jednaki dva objekta imaju istu granicu i unutranjost. CONTAINS: sadri unutranjost i granica jednog objekta su kompletno sadrani u unutranjosti drugog objekta. COVERS: pokriva unutranjost jednog objekta je kompletno sadrana u unutranjosti ili granici drugog objekta i njihove granice se seku. INSIDE: unutar suprotno od sadri (contains). A unutar B implicira B sadri A. COVEREDBY: pokriven sa suprotno od pokriva (covers). A pokriven sa B implicira B pokriva A. ON: na unutranjost i granica jednog objekta je na granici drugog objekta (i drugi objekat pokriva prvi objekat). Primer ove relacija je kada je linija na granici poligona. ANYINTERACT: interaguju objekti nisu nepovezani.

11

12/12/2007

Sintaksa operatora SDO_RELATE


SDO_RELATE(geometry1 SDO_GEOMETRY, geometry2 SDO_GEOMETRY, param VARCHAR2)
geometry1 je kolona tipa SDO_GEOMETRY u tabeli. Ova kolona mora biti prostorno indeksirana. geometry2 je objekat tipa SDO_GEOMETRY. Ovaj objekat moe ali ne mora biti iz tabele, a ako dolazi iz tabele moe ali ne mora biti prostorno indeksiran. param je string pod znacima navoda sa kljunom rei mask i validnim vrednostima maske, i opciono sa jednom ili obe kljune rei min_resolution i max_resolution.

Izraz SDO_RELATE(geometry1, geometry2, 'mask = <some_mask_val>') = 'TRUE' dodeljuje TRUE parovima objekata koji imaju topoloke relacije koje odgovaraju vrednosti zadate maske, a u suprotnom FALSE.

Kljuna re: mask


Kljuna re mask maska specificira topoloku relaciju od interesa. Operator SDO_RELATE zahteva specificiranje kljune rei mask. Validne vrednosti kljune rei mask su definisane devetopresenim (nine-intersection) modelom i mogu biti:
TOUCH, OVERLAPBDYDISJOINT, OVERLAPBDYINTERSECT, EQUAL, INSIDE, COVEREDBY, CONTAINS, COVERS, ANYINTERACT, ON, Kombinacije tipa: 'MASK=INSIDE+TOUCH.

12

12/12/2007

Nain korienja operatora SDO_RELATE


Operator je onemoguen ako tabela nema prostorni indeks ili ako je indeks kreiran na vie od dve dimenzije. Operator se uvek mora koristiti u WHERE klauzuli, a uslov koji ukljuuje operator mora biti u formi SDO_RELATE(arg1, arg2, 'mask =<some_mask_val>') = 'TRUE'. geometry2 moe poticati iz tebele ili biti tranzijentni SDO_GEOMETRY objekat, ako nije prostorno indeksiran, operator ga indeksira i postiu se dobre performanse; ako se dve ili vie geometrija iz geometry2 prosleuju operatoru, ORDERED optimizer hint mora biti specificiran, i tabela u geometry2 mora biti prva specificirana u FROM klauzuli. Ako su geometry1 i geometry2 bazirani na razliitim koordinatnim sistemima geometry2 se privremeno transformie u koordinatni sistem geometry1 da bi se izvela operacija. Maske DISJOINT ili DETERMINE koje se mogu koristiti u analognoj funkciji SDO_GEOM.RELATE, ovde se ne mogu koristiti, jer potrebne informacije da bi se zadovoljile ove dve maske nisu prisutne u prostornom indeksu na kom se bazira ovaj operator. Sem kombinacija inside+coveredby i contains+covers, bolje je koristiti maske individualno, a rezultate povezivati sintaksom UNION ALL zbog internih optimizacija koje Spatial sprovodi kada su maske specificirane pojedinano, a ne grupno.

Operatori koji su ekvivalentni SDO_RELATE operatoru sa odgovarajuom maskom


SDO_ANYINTERACT(geometry1, geometry2) ekvivalentan je sa SDO_RELATE(geometry1, geometry2, 'mask=anyinteract'); SDO_CONTAINS(geometry1, geometry2) ekvivalentan je sa SDO_RELATE(geometry1, geometry2, 'mask=contains'); SDO_COVEREDBY(geometry1, geometry2) ekvivalentan je sa SDO_RELATE(geometry1, geometry2, 'mask=coveredby'); SDO_COVERS(geometry1, geometry2) ekvivalentan je sa SDO_RELATE(geometry1, geometry2, 'mask=covers'); SDO_EQUAL(geometry1, geometry2) ekvivalentan je sa SDO_RELATE(geometry1, geometry2, 'mask=equal'); SDO_INSIDE(geometry1, geometry2) ekvivalentan je sa SDO_RELATE(geometry1, geometry2, 'mask=inside'); SDO_ON(geometry1, geometry2) ekvivalentan je sa SDO_RELATE(geometry1, geometry2, 'mask=on'); SDO_OVERLAPBDYDISJOINT(geometry1, geometry2) ekvivalentan je sa SDO_RELATE(geometry1, geometry2, 'mask= overlapbdydisjoint '); SDO_OVERLAPBDYINTERSECT(geometry1, geometry2) ekvivalentan je sa SDO_RELATE(geometry1, geometry2, 'mask=overlapbdyintersect'); SDO_OVERLAPS(geometry1, geometry2) ekvivalentan je sa SDO_RELATE(geometry1, geometry2, 'mask=overlaps'); SDO_TOUCH(geometry1, geometry2) ekvivalentan je sa SDO_RELATE(geometry1, geometry2, 'mask=touch');

13

12/12/2007

Operator SDO_WITHIN_DISTANCE
SDO_WITHIN_DISTANCE operator odreuje da li su dva prostorna objekta, A i B, unutar specificirane razdaljine jedan u odnosu na drugog. Ovaj operator prvo konstruie bafer razdaljine, Db, oko referentnog objekta B. On onda proverava da li su A i Db nepovezani. Bafer razdaljine objekta se sastoji od svih taaka unutar date razdaljine od tog objekta.

Bafer razdaljine za taku, liniju i poligon

Sintaksa operatora SDO_WITHIN_DISTANCE


SDO_WITHIN_DISTANCE(geometry1 SDO_GEOMETRY, aGeom SDO_GEOMETRY, params VARCHAR2)
geometry1 je kolona tipa SDO_GEOMETRY u tabeli. Ova kolona mora biti prostorno indeksirana. aGeom je instanca tipa SDO_GEOMETRY. params je string pod znacima navoda koji sadri parove kljunih rei i njihovih vrednosti koji odreuju ponaanje operatora. Ovde se mogu nai neke od sledeih kljunih rei: distance, max_resolution, min_resolution, querytype i unit. Kljuna re distance razdaljina je obavezna.

Izraz SDO_WITHIN_DISTANCE(arg1, arg2, arg3) = 'TRUE' dodeljuje TRUE parovima objekata koji su unutar specificirane razdaljine, a inae FALSE.

14

12/12/2007

Kljune rei operatora SDO_WITHIN_DISTANCE


Kljuna re distance specificira vrednost razdaljine. Ako je koordinatni sistem pridruen geometriji, jedinica razdaljine je ista ona jedinica koja je pridruena koordinatnom sistemu. Ova kljuna re je obavezna. Kljuna re querytype slui da bi se definisalo da li treba izvriti samo primarnu filter operaciju ili i primarnu i sekundarnu. Ako se stavi 'querytype=FILTER' izvrava se samo primarni filter, ako se ne specifira ova kljuna re oba filtera e se izvriti (default). Kljuna re unit specificira jedinicu mere (na primer 'unit=KM'). Default je jedinica koja je pridruena podacima. Za geodetske podatke, default jedinica je metar. Kljune rei max_resolution i min_resolution imaju isto znaenje kao i
kod ostalih operatora.

Nain korienja operatora SDO_WITHIN_DISTANCE


Razdaljina izmeu dva objekta koji nisu take je definisana kao minimalna razdaljina izmeu ta dva objekta. Razdaljina izmeu dva poligona koji se dodiruju je 0. Ako se operator koristi sa geodetskim podacima, podaci moraju biti indeksirani sa R-tree prostornim indeksom, koji ako nije kreiran kao geodetski, ne moe se koristi unit parametar. Operator je onemoguen ako tabela nema prostorni indeks ili je on kreiran na vie od dve dimenzije. Operator se uvek mora koristiti u WHERE klauzuli, a uslov koji ukljuuje operator mora biti u formi SDO_WITHIN_DISTANCE(arg1, arg2, 'distance = <some_dist_val>') = 'TRUE'. Kolona sa geometrijom mora imati prostorni indeks kreiran nad njom. Ako su podaci geodetski prostorni indeks mora biti R stablo. SDO_WITHIN_DISTANCE ne podrava prostorne spojeve.

15

12/12/2007

Operator SDO_NN
Operator SDO_NN se koristi da identifikuje najblie susede za datu geometriju. Operator SDO_NN vraa odreeni broj objekata iz kolone sa geometrijom koji su najblii datoj geometriji (na primer, pet najbliih restorana gradskom parku). U odreivanju koliko su blizu dve geometrije, koristi se najmanja mogua razdaljina izmeu bilo koje dve take na povrini.

Sintaksa operatora SDO_NN


SDO_NN(geometry1 SDO_GEOMETRY, geometry2 SDO_GEOMETRY, param VARCHAR2 [, number NUMBER]);
geometry1 je kolona tipa SDO_GEOMETRY u tabeli. Ova kolona mora biti prostorno indeksirana. geometry2 je instanca tipa SDO_GEOMETRY. Param je string pod navodnicima parova kljunih rei i njihovih vrednosti koji odreuje ponaanje operatora, kao na primer koliko najbliih geometrija treba vratiti. Ove kljune rei su sdo_batch_size, sdo_num_res i unit. Number je isti broj koji se kosti i pri pozivu SDO_NN_DISTANCE. Ovo se koristi samo ako je pomoni operator SDO_NN_DISTANCE ukljuen u poziv SDO_NN.

16

12/12/2007

Pomoni operator SDO_NN_DISTANCE


SDO_NN_DISTANCE je pomoni operator operatora SDO_NN. On vraa razdaljinu izmeu specificirane geometrije i susednih objekata koje je pronaao SDO_NN. Ova razdaljina se prosleuje kao pomoni podatak SDO_NN operatoru. Za parametar number se moe izabrati bilo koji arbitrarni broj, jedini zahtev je da mora biti isti kao poslednji parametar u pozivu SDO_NN operatora.

Kljune rei operatora SDO_NN


Kljuna re sdo_batch_size specificira broj vrsta koje treba evaluirati kada se SDO_NN izraz treba evaluirati vie puta da bi vratio eljeni broj rezultata koji zadovoljavaju WHERE klauzulu. Kljuna re sdo_num_res specificira broj rezultata koje treba vratiti. Ako je sdo_batch_size specificiran, ova kljuna re se ignorie, pa je potrebno koristiti ROWNUM pseudokolonu da bi se ograniio broj rezultata. Kljuna re unit oznaava jedinicu u kojoj se izraava razdaljina kada se koristi pomoni operator SDO_NN_DISTANCE.

17

12/12/2007

Razlika u upotrebi kljunih rei sdo_num_res i sdo_batch_size [1/2]


Razlika u upotrebi kljunih rei sdo_num_res i sdo_batch_size se moe objasniti na sledeem primeru:
pretpostavimo da imamo tabelu RESTORANI koja sadri razliite tipove restorana i da je potrebno nai dva najblia kineska restorana u odnosu na neki objekat. Upit bi izgledao ovako: SELECT r.naziv FROM restorani r WHERE SDO_NN(r.geometrija, :hotel, 'sdo_batch_size=10') = 'TRUE' AND r.tip = 'kineski' AND ROWNUM <=2;

ROWNUM <=2 ograniava da upit ne vrati vie od dva rezultata. Ako bi specificirali sdo_num_res=2 umesto ROWNUM <=2, a da pri tom sdo_batch_size nije specificiran, operator bi vratio dva najblia restorana bez obzira da li su kineski ili ne, a ako nisu kineski upit ne bi vratio nijedan rezultat.

Razlika u upotrebi kljunih rei sdo_num_res i sdo_batch_size [2/2]


Kljuna re sdo_batch_size moe da utie na performanse upita, pa je najbolje za ovu kljunu re specificirati broj vrsta kandidata za koje je verovatno da e zadovoljiti WHERE klauzulu. Primer: ako je 20% restorana koji su u blizini hotela kineski a potrebno je pronai dva, sdo_batch_size=10 e dati najbolje performanse. S druge strane, ako je 5% restorana koji su u blizini hotela kineski, a potrebno je pronai dva, sdo_batch_size=40 e dati najbolje performanse. Ako se specificira da je sdo_batch_size=0, tada e Spatial odrediti vrednost koja je pogodna za veliinu rezultujueg skupa. Ova vrednost moda nee biti optimalna, a i izraunavanje ove vrednosti uzima neko vreme tako da je najbolje da korisnik sam definie ovu vrednost ako moe da je odredi. Ako se dobro odredi ova vrednost, performanse e biti bolje nego ako se stavi da je sdo_batch_size=0.

18

12/12/2007

Nain korienja operatora SDO_NN


Ovaj operator je onemoguen ako tabela nema prostorni indeks ili ako je indeks kreiran na vie od dve dimenzije. Operator se uvek mora koristiti u WHERE klauzuli i uslov koji ukljuuje operator treba da bude u formi SDO_NN(arg1, arg2, '<some_parameter>') = 'TRUE'. Ako se dve geometrije nalaze na istoj udaljenosti od datog objekta, bilo koja od ove dve gemetrije se moe vratiti prilikom svakog poziva, ako specificirani broj vrsta koje treba vratiti nije dovoljan da se vrate obe. Ako se geometrije 1 i 2 baziraju na razliitim koordinatnim sistemima, geometrija 2 se privremeno transformie u koordinatni sistem geometrije 1 prilikom izvravanja operacije. U nekim sluajevima SDO_NN operator nee koristiti prostorni indeks osim ako se to ne specificira upotrebom optimizer hint: /*+ INDEX(parcela parcela_ind) */. Ovo se moe dogoditi ako upit ukljuuje spoj; i ako se optimizer hint ne koristi u ovim situacijama, moe se javiti interna greka. Da bi se spreile ovakve greke, potrebno je uvek specificirati da se koristi prostorni indeks, bez obzira kakav je upit. Ako je nad nekom kolonom koja se koristi u WHERE klauzuli, a koja nije prostorna, odnosno ne sadri geometrije, definisan indeks, potrebno je specificirati da se ovaj indeks ne koristi upotrebom NO_INDEX hinta na sledei nain: SELECT /*+ INDEX(c parcela_idx) NO_INDEX(c naziv_parcele_idx) */c.id, c.naziv, ... FROM parcela c, ...;

Prostorne funkcije i procedure


Oracle Spatial obezbeuje brojne funkcije i procedure za odreivanje relacija izmeu geometrija, pronalazei informacije o pojedinanim geometrijama, promenljivim geometrijama i kombinovanim geometrijama. Sve funkcije uzimaju u obzir dve dimenzije izvornih podataka. Ako je izlazna vrednost ovih funkcija geometrija, rezultujua geometrija e imati istu dimenzionalnost kao ulazna geometrija, ali samo e prve dve dimenzije tano reflektovati rezultat operacije. Prostorne procedure i funkcije se nalaze u potprogramima u PL/SQL paketima, kao to su SDO_GEOM, SDO_CS i SDO_LRS. Ovi potprogrami ne zahtevaju da se prostorni indeksi definiu, a oni ni ne koriste prostorne indekse ak i ako su definisani. Ovi potprogrami se mogu koristiti u WHERE klauzuli ili u podupitu. Ako su dve geometrije ulazni parametri Spatial proceduri ili funkciji, obe moraju imati isti koordinatni sistem.

19

12/12/2007

Poreenje funkcija i procedura sa operatorima


Ako operator i procedura ili funkcija obavljaju uporedive operacije, i ako operator zadovoljava zahteve, onda treba koristiti operator zato to ima bolje performanse u odnosu na funkcije i procedure jer koristi prostorni indeks. Primer: treba koristiti SDO_RELATE umesto SDO_GEOM.RELATE i SDO_WITHIN_DISTANCE umesto SDO_GEOM.WITHIN_DISTANCE.

Prostorni spoj operator SDO_JOIN


Prostorni spoj (spatial join) je isti kao i regularni spoj osim to predikat ukljuuje prostorne operatore. Prostorni spoj se odigrava kada se porede sve geometrije jednog sloja (layer) sa svim geometrija drugog sloja. Ovo je razliito od prozora upita koji poredi jednu geometriju sa svim geometrijama sloja. Obino se jedna tabela odnosi na jedan sloj. Operator SDO_JOIN se koristi za izvravanje prostornog spoja.

20

12/12/2007

Sintaksa operatora SDO_JOIN


SDO_JOIN(table_name1, column_name1, table_name2, column_name2, params, preserve_join_order) RETURN SDO_ROWIDSET;
table_name1 je naziv prve tabele koja se koristi u prostornom spoju i koja ima kolonu tipa SDO_GEOMETRY. column_name1 je naziv prostorne kolone tipa SDO_GEOMETRY u table_name1. Prostorni R-tree indeks mora biti definisan nad ovom kolonom. table_name2 je naziv druge tabele koja se koristi u prostornom spoju i koja ima kolonu tipa SDO_GEOMETRY (moe biti u pitanju ista tabela kao table_name1). column_name2 je naziv prostorne kolone tipa SDO_GEOMETRY u table_name2. Prostorni R-tree indeks mora biti definisan nad ovom kolonom. Params je opcioni string kljunih rei i njihovih vrednosti; dostupni su samo ako je mask=ANYINTERACT. On odreuje ponaanje operatora.

SDO_JOIN vraa objekat tipa SDO_ROWIDSET, koji se sastoji od tabele objekata tipa SDO_ROWIDPAIR, odnosno vraa parove identifikatora vrsta rowid1 i rowid2, gde je rowid1 rowid (identifikator vrste) iz table_name1, a rowid2 je rowid iz table_name2.

Kljune rei operatora SDO_JOIN


Kljuna re mask oznaava topoloke relacije od interesa i ima identino znaenje kao kod SDO_RELATE operatora. Kljuna re distance specificira numeriku vrednost koja se dodaje vrednosti parametra tolerance pre nego to pone izvravanje provere relacija meu objektima. Na primer, ako je tolerancija 5m i distance se definie na distance=10 i unit=meter, tada za sve objekte koji su na razdaljini unutar 15m jedan od drugog se smatra da interaguju. Kljuna re unit specificira jedinicu mere za distance vrednost. preserve_join_order je opcioni parametar koji specificira da li se garantuje da e se ouvati redosled prostornog spoja tokom izvravanja operatora. Ako je vrednost 0 (default), redolsed tabela moe biti promenjen, ako je vrednost 1, redosled tabela se ne menja.

21

12/12/2007

Nain korienja operatora SDO_JOIN


SDO_JOIN tehniki nije operator, ve tabelarna funkcija. Meutim, obino se prezentuje zajedno sa operatorima jer je njogovo koritenje slino operatorima, i zato to nije deo nijednog paketa sa funkcijama i procedurama. Ova tabelarna funkcija se preporuuje kada je potrebno izvriti puni spoj tabela. Geometrije u column_name1 i column_name2 moraju imati istu SRID (koordinatni sistem) vrednost i isti broj dimenzija. Da bi se postigle dobre performanse, potrebno je koristiti /*+ ORDERED */ optimizer hint, i specificirati SDO_JOIN tabelarnu funkciju kao prvu u FROM klauzuli.

Sadraj
Indeksiranje prostornih podataka Upiti nad prostornim podacima Primeri indeksiranja i prostornih upita nad bazom podataka za katastar

22

12/12/2007

Tabela KATASTARSKA_OPSTINA

Tabela PARCELA

23

12/12/2007

Tabela ZGRADA

Kreiranje prostronih indeksa nad SDO_GEOMETRY kolonom


CREATE INDEX kat_opstina_idx ON katastarska_opstina (geometrija) INDEXTYPE IS MDSYS.SPATIAL_INDEX;

CREATE INDEX parcela_idx ON parcela (geometrija) INDEXTYPE IS MDSYS.SPATIAL_INDEX;

CREATE INDEX zgrada_idx ON zgrada (geometrija) INDEXTYPE IS MDSYS.SPATIAL_INDEX;

24

12/12/2007

SDO_FILTER
Koje zgrade moda interaguju sa parcelom broj 800?
SELECT p.broj, z.broj, z.broj_parcele FROM parcela p, zgrada z WHERE SDO_FILTER(p.geometrija, z.geometrija)='TRUE' AND p.broj=800;

SDO_RELATE [1/5]
Koje zgrade interaguju sa parcelom broj 800?
SELECT p.broj, z.broj, z.broj_parcele FROM parcela p, zgrada z WHERE SDO_RELATE(p.geometrija, z.geometrija, mask=anyinteract)='TRUE' AND p.broj=800;

25

12/12/2007

SDO_RELATE [2/5]
Sa kojim parcelama, parcela broj 137, stoji u prostornom odnosu dodiruje?
SELECT p.broj FROM parcela p137, parcela p WHERE p137.broj = 137 AND SDO_RELATE(p.geometrija, p137.geometrija, mask=touch) = 'TRUE'; ILI SELECT p.broj FROM parcela p137, parcela p WHERE p137.broj = 137 AND SDO_TOUCH(p.geometrija, p137.geometrija) = 'TRUE';

SDO_RELATE [3/5]
Sa kojim zgradama parcela broj 800 stoji u prostornom odnosu sadri?
SELECT p.broj, z.broj FROM parcela p, zgrada z WHERE SDO_RELATE(p.geometrija, z.geometrija, mask=contains)='TRUE' AND p.broj=800; ILI SELECT p.broj, z.broj FROM parcela p, zgrada z WHERE SDO_CONTAINS(p.geometrija, z.geometrija)='TRUE' AND p.broj=800;

26

12/12/2007

SDO_RELATE [4/5]
Da li katastarska optina Popovi1 stoji u prostornom odnosu pokriva sa parcelom broj 291?
SELECT SDO_RELATE(k.geometrija, p.geometrija, mask=covers) FROM katastarska_opstina k, parcela p WHERE k.naziv = 'Popovi1' AND p.broj = 291; ILI SELECT SDO_COVERS(k.geometrija, p.geometrija) FROM katastarska_opstina k, parcela p WHERE k.naziv = 'Popovi1' AND p.broj = 291;

SDO_RELATE [5/5]
Koje parcele preklapa zadati pravougaonik?
SELECT p.broj, p.podbroj FROM parcela p WHERE SDO_RELATE(p.geometrija, SDO_GEOMETRY(2003, 31276, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(6602283.97,4959931.97, 6602359.48,4960016.78)), mask= overlapbdyintersect) = 'TRUE'; ILI SELECT p.broj, p.podbroj FROM parcela p WHERE SDO_OVERLAPBDYINTERSECT(p.geometrija, SDO_GEOMETRY(2003, 31276, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(6602283.97,4959931.97, 6602359.48,4960016.78)) ) = 'TRUE';

27

12/12/2007

SDO _WITHIN _DISTANCE [1/2]


Koje zgrade se nalaze unutar razdaljine od 10m od zgrade broj 2 na parceli 800?

SELECT z.broj, z.broj_parcele FROM zgrada z, zgrada z2 WHERE z2.broj_parcele=800 AND z2.broj=2 AND SDO_WITHIN_DISTANCE(z.geometrija, z2.geometrija, distance=10) = 'TRUE';

SDO _WITHIN _DISTANCE [2/2]


Koje zgrade se nalaze unutar razdaljine od 5m od zgrade broj 2 na parceli 800?

SELECT z.broj, z.broj_parcele FROM zgrada z, zgrada z2 WHERE z2.broj_parcele=800 AND z2.broj=2 AND SDO_WITHIN_DISTANCE(z.geometrija, z2.geometrija, distance=5) = 'TRUE';

28

12/12/2007

SDO_NN [1/4]
Kojih pet zgrada su najblie zgradi broj 2 na parceli 800?
Upotreba kljune rei sdo_num_res.
SELECT /*+ INDEX(parcela parcela_idx) */ z.broj, z.broj_parcele FROM zgrada z, zgrada z2 WHERE z2.broj_parcele=800 AND z2.broj=2 AND SDO_NN(z.geometrija, z2.geometrija, sdo_num_res=5) = 'TRUE';

SDO_NN [2/4]
Kojih pet zgrada su najblie zgradi broj 2 na parceli 800 i kolika je njihova razdaljina?
Upotreba kljune rei sdo_num_res.
SELECT /*+ INDEX(parcela parcela_idx) */ z.broj, z.broj_parcele, SDO_NN_DISTANCE(1) FROM zgrada z, zgrada z2 WHERE z2.broj_parcele=800 AND z2.broj=2 AND SDO_NN(z.geometrija, z2.geometrija, sdo_num_res=5, 1) = 'TRUE';

29

12/12/2007

SDO_NN [3/4]
Kojih pet zgrada su najblie zgradi broj 2 na parceli 800?
Upotreba kljune rei sdo_batch_size.

SELECT /*+ INDEX(parcela parcela_idx) */ z.broj, z.broj_parcele FROM zgrada z, zgrada z2 WHERE z2.broj_parcele=800 AND z2.broj=2 AND SDO_NN(z.geometrija, z2.geometrija, sdo_batch_size=5) = 'TRUE' AND rownum<=5;

SDO_NN [4/4]
Kojih pet zgrada su najblie zgradi broj 2 na parceli 800 i kolika je njihova razdaljina?
Upotreba kljune rei sdo_batch_size.
SELECT /*+ INDEX(parcela parcela_idx) */ z.broj, z.broj_parcele, SDO_NN_DISTANCE(1) FROM zgrada z, zgrada z2 WHERE z2.broj_parcele=800 AND z2.broj=2 AND SDO_NN(z.geometrija, z2.geometrija, sdo_batch_size=5, 1) = 'TRUE' AND rownum<=5;

30

12/12/2007

SDO_JOIN
Koje zgrade pripadaju kojoj parceli?
SELECT /*+ ordered */ a.broj, b.broj, b.broj_parcele FROM TABLE(SDO_JOIN('parcela', 'geometrija', 'zgrada', 'geometrija', 'mask=COVERS+CONTAINS')) c, parcela a, zgrada b WHERE c.rowid1 = a.rowid AND c.rowid2 = b.rowid ORDER BY a.broj;

Kraj prezentacije

Hvala na panji!

31

You might also like