Optimaliseringer for WFS-kall i GeoServer

Innhold

  • Introduksjon
  • Definisjoner
  • Filterinformasjon for hver featuretype
  • Eksempler
  • Introduksjon

    Featuretypene matrikkelsystemets WFS-tjenester er bygd opp av baserer seg på database-views i Oracle. Disse er bygget på bakgrunn av tabeller og har i de fleste tilfeller joins mellom forskjellige tabeller. Vi har observert at Oracle ikke klarer å bygge en optimal kjøringsplan for spørringer basert på viewene i mange tilfeller. Blant annet viser det seg at databasekall som inneholder et geometrisk filter vil føre til at Oracle ønsker å kombinere hele tabeller da den ikke klarer å spå hvor mange elementer det geometriske filteret vil gi.

    På bakgrunn av dette har vi innført våre egne optimaliseringer i GeoServers kode slik at "vanlige" kall skal kunne få best mulig ytelse. For WMS har vi gjort det svært enkelt ved å optimalisere for tilfeller der eneste filter er geometrisk, mens for WFS blir det en del mer komplekst. For WFS har vi valgt å optimalisere kall om enten er enkle geometriske kall, eller som har et AND-filter i bunn. I tillegg til dette kravet har vi bestemt at hvert delfilter må kun filtrere på en av tabellene som er grunnlag for featuretypen. Nedenfor går vi nærmere inn på hva dette betyr.

    Definisjoner

  • Subfilter: En del av et AND filter. Kan være oppdelt i flere biter selv. Eksempel: (x AND y). x er et subfilter selv om x = (z AND p)
  • Under følger mer detaljert informasjon om hvilke felter som filtreres. Felles for TEIGWFS, ANLEGGSPFLATEWFS, VEGADRESSEWFS og MATRIKKELADRESSEWFS er at vi har en spesiell filtrering for KOMMUNENR. Dette feltet vil brukes for optimalisering dersom det kan brukes for å begrense resultater som blir funnet for egenskapsfilter. Dette beskrives nærmere under i strategi for optimalisering.

    TEIGWFS/ANLEGGSPFLATEWFS

    Det er her tre forskjellige optimaliseringsstrategier. Subfiltrene deles opp i fire grupper: Matrikkelenhetfilter, representasjonspunktfilter, flatefilter og ikke-optimaliserte.

    Definisjonene for de tre er:

  • Matrikkelenhetfilter: Et filter som filtrerer på en eller flere av egenskapene GARDSNR, BRUKSNR, FESTENR, SEKSJONSNR, PUNKTFESTE, UNDERSAMMENSLAINGBESTAR eller UNDERSAMMENSLAINGUTGAR.
  • Representasjonspunktfilter: Et filter som kun filtrerer på REPRESENTASJONSPUNKT
  • Flatefilter: Et filter som kun filtrerer på FLATE
  • Andre filter går i ikke-optimaliserte.

    VEGADRESSEWFS

    Det er her tre forskjellige optimaliseringsstrategier. Subfiltrene deles opp i fire grupper: Vegfilter, adresseegenskapsfilter, representasjonspunktfilter og ikke-optimaliserte.

    Definisjonene for de tre er:

  • Vegfilter: Et filter som filtrerer på en eller flere av egenskapene ADRESSEKODE eller ADRESSENAVN
  • Adresseegenskapfilter: Et filter som filtrerer på en eller flere av egenskapene NR, BOKSTAV, ADRESSETILLEGGSNAVN eller TILLEGGSNAVNKILDEKODE
  • Representasjonspunktfilter: Et filter som kun filtrerer på REPRESENTASJONSPUNKT
  • Andre filter går i ikke-optimaliserte.

    MATRIKKELADRESSEWFS

    Det er her to forskjellige optimaliseringsstrategier. Subfiltrene deles opp i tre grupper: Matrikkelenhetfilter, representasjonspunktfilter og ikke-optimaliserte.

    Definisjonene for de to er:

  • Matrikkelenhetfilter: Et filter som filtrerer på en eller flere av egenskapene GARDSNR, BRUKSNR eller FESTENR
  • Representasjonspunktfilter: Et filter som kun filtrerer på REPRESENTASJONSPUNKT
  • Andre filter går i ikke-optimaliserte.

    BYGNINGWFS

    Det er her ikke gjort noen optimalisering basert på filter, men det har blitt lagt inn en indeks i databasen som bygger opp BYGNINGSNR slik det presenteres her.

    Strategi for optimalisering

    Som vi ser av gruppene for de overliggende featuretypene vil det generelt være tre forskjellige egenskaps-typer vi filtrerer på. Disse er:

  • Geometrisk flate
  • Geometrisk punkt
  • Egenskaper
  • For de geometriske gruppene er det nok at filteret inneholder ett subfilter som filtrerer på disse gruppene, men for egenskapsgruppen kreves det minst to subfiltre. Dette er gjort for å slippe å gjøre jobb for å sjekke om filteret begrenser resultatet nok dersom det er liten sannsynlighet for dette. Unntak for denne regelen er egenskaper for veg. Disse ses på som så begrensende at man bare trenger å angi en av dem for å bruke disse for optimalisering (ADRESSEKODE/ADRESSENAVN).

    Optimalisering av KOMMUNENR blir gjort på følgende måte. I de tilfeller man kan optimalisere på elementer som har kobling til kommune, og man har angitt KOMMUNENR, vil dette brukes for å begrense resultatsettet på en bedre måte. Eksempel på dette er at man angir følgende som kall til TEIGWFS: GARDSNR=2 AND BRUKSNR=45 AND KOMMUNENR=0233. Her vil det kunne optimaliseres på GARDSNR + BRUKSNR, men det vil da være enda raskere å gjøre en sjekk på kommune først. Grunnen til dette er oppbygging av indekser i databasen. På grunn av at KOMMUNENR i mange tilfeller er en svært begrensende faktor er det også slik at systemet kan velge å optimalisere på egenskaper selv om man bryter med kravet over om å ha to egenskaper i filteret sitt for optimalisering. Dette betyr at følgende filter: GARDSNR=2 AND KOMMUNENR=0233 også vil bli forsøkt optimalisert.

    Eksempler

    For å belyse hvordan man kan bygge opp kall for optimalisering er det under et eksemplel for hver av typene det har blitt gjort optimalisering for.

    TEIGWFS/ANLEGGSPFLATEWFS

    Ønsker å finne en bestemt matrikkelenhet med gårdsnr 8 og bruksnr 2 i kommune 0605 Ringerike. Vi vet i tillegg at matrikkelenheten ligger innenfor boksen (585080,6646930),(624620,6668450) (koordinater her angitt i x,y som blir øst,nord). Den enkleste måten å skrive kallet på blir da:

       /geoserver/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>
       

    Her er kallet lagt inn i en enkel AND rundt alle elementer og dette vil gi GeoServer gode sjanser til å finne den mest optimale framgangsmåten å kjøre kallet på. GeoServer vil kunne gjøre optimaliseringer uavhengig av om man velger å dele opp kallet i flere AND-filter. Kallet kunne for eksempel se slik ut:

          /geoserver/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>
                <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>
                </And>
                <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>
       

    Her har vi valgt å sette sammen alle matrikkelenhetsfilterelementer i en AND og boksen utenfor. Dette er ikke noe problem.

    VEGADRESSEWFS

    Viser her to alternative måter å finne et gitt sett av adresser. Adressene vi søker etter har ikke bokstav satt, har nr større enn 5 og er i vegen ASKVEIEN. I det ene eksempelet går vi inn via KOMMUNENR, og i det andre via en boks.

    Eksempel der vi filtrerer på KOMMUNENR:

          /geoserver/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>
                <PropertyIsEqualTo>
                   <PropertyName>ADRESSENAVN</PropertyName>
                   <Literal>ASKVEIEN</Literal>
                </PropertyIsEqualTo>
                <PropertyIsGreaterThan>
                   <PropertyName>NR</PropertyName>
                   <Literal>5</Literal>
                </PropertyIsGreaterThan>
                <PropertyIsNull>
                   <PropertyName>BOKSTAV</PropertyName>
                   <Literal></Literal>
                </PropertyIsNull>
                <PropertyIsEqualTo>
                   <PropertyName>KOMMUNENR</PropertyName>
                   <Literal>0233</Literal>
                </PropertyIsEqualTo>
             </And>
          </ogc:Filter>
       

    Eksempel der vi filtrerer på boks

          /geoserver/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>
                <PropertyIsEqualTo>
                   <PropertyName>ADRESSENAVN</PropertyName>
                   <Literal>ASKVEIEN</Literal>
                </PropertyIsEqualTo>
                <PropertyIsGreaterThan>
                   <PropertyName>NR</PropertyName>
                   <Literal>5</Literal>
                </PropertyIsGreaterThan>
                <PropertyIsNull>
                   <PropertyName>BOKSTAV</PropertyName>
                   <Literal></Literal>
                </PropertyIsNull>
                <ogc:BBOX>
                   <ogc:PropertyName>REPRESENTASJONSPUNKT</ogc:PropertyName>
                   <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:32632">
                      <gml:coordinates>606050,665900 606980,6661000</gml:coordinates>
                   </gml:Envelope>
                </ogc:BBOX>         
             </And>
          </ogc:Filter>
       

    Her ser vi eksempler på forskjellige måter å spørre om data på. Man trenger ikke kun spørre på likhet, men kan også spørre på NULL-verdier og større enn/mindre enn.

    MATRIKKELADRESSEWFS

    Matrikkeladresse er satt opp på ganske lik måte som TEIGWFS så kall vil kunne optimaliseres på ganske lik måte. For å være sikkerp å at kallet blir optimalisert på best mulig måte er det viktig å gi med så mye informasjon som mulig. I eksempelet her spør vi etter alle matrikkeladresser i 0233 Nittedal med gårdsnr 10, festenr 0 som ligger innenfor boksen (604350,6653300) (605550,6654500).

          /geoserver/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>
                <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>
       

    Her kan GeoServer optimalisere både på egenskaper og boks, og vil velge en strategi som gir best mulig svartid.