Optimaliseringer for WFS-kall i GeoServer
Introduksjon
Featuretypene i matrikkelens WFS-tjenester er bygd opp av database-views i Oracle. Disse er bygget på bakgrunn av tabeller og har i de fleste tilfeller joins mellom forskjellige tabeller. Oracle klarer ikke alltid å bygge en optimal kjøringsplan for spørringer basert på viewene — blant annet vil databasekall som inneholder et geometrisk filter føre til at Oracle ønsker å kombinere hele tabeller.
På bakgrunn av dette er det innført egne optimaliseringer i GeoServers kode. For WMS er det optimalisert for tilfeller der eneste filter er geometrisk. For WFS optimaliseres kall som enten er enkle geometriske kall, eller som har et AND-filter i bunn, der hvert delfilter kun filtrerer på én av tabellene som er grunnlag for featuretypen.
Definisjoner
Subfilter: En del av et AND-filter. Kan selv være oppdelt i flere biter. Eksempel: (x AND y) — x er et subfilter selv om x = (z AND p).
Filterinformasjon per featuretype
TEIGWFS / ANLEGGSPFLATEWFS
Subfiltre deles i fire grupper:
- Matrikkelenhetfilter: Filtrerer på én eller flere av
GARDSNR,BRUKSNR,FESTENR,SEKSJONSNR,PUNKTFESTE,UNDERSAMMENSLAINGBESTARellerUNDERSAMMENSLAINGUTGAR - Representasjonspunktfilter: Filtrerer kun på
REPRESENTASJONSPUNKT - Flatefilter: Filtrerer kun på
FLATE - Ikke-optimaliserte: Alt annet
VEGADRESSEWFS
Subfiltre deles i fire grupper:
- Vegfilter: Filtrerer på
ADRESSEKODEellerADRESSENAVN - Adresseegenskapsfilter: Filtrerer på
NR,BOKSTAV,ADRESSETILLEGGSNAVNellerTILLEGGSNAVNKILDEKODE - Representasjonspunktfilter: Filtrerer kun på
REPRESENTASJONSPUNKT - Ikke-optimaliserte: Alt annet
MATRIKKELADRESSEWFS
Subfiltre deles i tre grupper:
- Matrikkelenhetfilter: Filtrerer på
GARDSNR,BRUKSNRellerFESTENR - Representasjonspunktfilter: Filtrerer kun på
REPRESENTASJONSPUNKT - Ikke-optimaliserte: Alt annet
BYGNINGWFS
Ingen filteroptimalisering, men det er lagt inn en databaseindeks som bygger opp BYGNINGSNR slik det presenteres i tjenesten.
Strategi for optimalisering
For geometriske grupper (flate og punkt) er det nok med ett subfilter. For egenskapsgruppen kreves minst to subfiltre — unntaket er vegegenskaper (ADRESSEKODE/ADRESSENAVN) som anses som så begrensende at ett subfilter er nok.
KOMMUNENR-optimalisering: Der man kan optimalisere på elementer med kommunekobling, og KOMMUNENR er angitt, brukes dette til å begrense resultatsettet ytterligere. For eksempel vil GARDSNR=2 AND BRUKSNR=45 AND KOMMUNENR=0233 optimalisere på gardsnr + bruksnr, men sjekke kommune først siden det er en begrensende faktor. Systemet kan også velge å optimalisere på egenskaper selv om kravet om to egenskaper brytes, dersom KOMMUNENR er angitt.
Eksempler
TEIGWFS / ANLEGGSPFLATEWFS
Finn matrikkelenhet med gårdsnr 8 og bruksnr 2 i kommune 0605 Ringerike, innenfor en gitt boks:
/geoservergeo/wfs/MATRIKKEL?VERSION=1.1.0&SERVICE=WFS&REQUEST=GetFeature&TYPENAME=TEIGWFS&Filter=
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml">
<And>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>GARDSNR</ogc:PropertyName>
<ogc:Literal>8</ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>BRUKSNR</ogc:PropertyName>
<ogc:Literal>2</ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>KOMMUNENR</ogc:PropertyName>
<ogc:Literal>0605</ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:BBOX>
<ogc:PropertyName>FLATE</ogc:PropertyName>
<gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:32632">
<gml:coordinates>565420,6658630 585662,6668517</gml:coordinates>
</gml:Envelope>
</ogc:BBOX>
</And>
</ogc:Filter>
VEGADRESSEWFS
Finn adresser i ASKVEIEN uten bokstav og med husnummer større enn 5, filtrert på kommune:
/geoservergeo/wfs/MATRIKKEL?VERSION=1.1.0&SERVICE=WFS&REQUEST=GetFeature&TYPENAME=VEGADRESSEWFS&Filter=
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml">
<And>
<PropertyIsEqualTo>
<PropertyName>ADRESSENAVN</PropertyName>
<Literal>ASKVEIEN</Literal>
</PropertyIsEqualTo>
<PropertyIsGreaterThan>
<PropertyName>NR</PropertyName>
<Literal>5</Literal>
</PropertyIsGreaterThan>
<PropertyIsNull>
<PropertyName>BOKSTAV</PropertyName>
</PropertyIsNull>
<PropertyIsEqualTo>
<PropertyName>KOMMUNENR</PropertyName>
<Literal>0233</Literal>
</PropertyIsEqualTo>
</And>
</ogc:Filter>
MATRIKKELADRESSEWFS
Finn matrikkeladresser i Nittedal (0233) med gårdsnr 10 og festenr 0, innenfor en gitt boks:
/geoservergeo/wfs/MATRIKKEL?VERSION=1.1.0&SERVICE=WFS&REQUEST=GetFeature&TYPENAME=MATRIKKELADRESSEWFS&Filter=
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml">
<And>
<PropertyIsEqualTo>
<PropertyName>GARDSNR</PropertyName>
<Literal>10</Literal>
</PropertyIsEqualTo>
<PropertyIsEqualTo>
<PropertyName>FESTENR</PropertyName>
<Literal>0</Literal>
</PropertyIsEqualTo>
<PropertyIsEqualTo>
<PropertyName>KOMMUNENR</PropertyName>
<Literal>0233</Literal>
</PropertyIsEqualTo>
<ogc:BBOX>
<ogc:PropertyName>REPRESENTASJONSPUNKT</ogc:PropertyName>
<gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:32632">
<gml:coordinates>604350,6653300 605550,6654500</gml:coordinates>
</gml:Envelope>
</ogc:BBOX>
</And>
</ogc:Filter>