[OSM-Devserver] Schnelleres Rendern durch Preprozessing

Jochen Topf jochen at remote.org
Di Mai 18 08:46:56 CEST 2010


On Mon, May 17, 2010 at 10:54:42PM +0200, Nop wrote:
> Ich wollte mal eine Erkenntnis aus der letzten Umstellung meiner Karte
> mit Euch teilen, vielleicht läßt es sich ja für Eure Projekte auch
> einsetzen.
>
> Normalerweise haben die Mapnik Layers eine ziemlich komplizierte
> SELECT-Anweisung, in der ein Haufen Abfragen auf die einzelnen Tags mit
> OR verknüpft werden. Die sind generell ziemlich unhandlich und wurden
> von der DB immer mit einem Table Scan abgehandlet, egal was ich an
> Tricks mit Indexen versucht habe.
>
> Ich mache mit den Daten ja ein Preprocessing, bevor sie in die DB
> kommen. Dabei gibt es einen Moment, wo ich bereits weiß, in welcher
> Layer bestimmte Objekte später angezeigt werden sollen. Also habe ich
> die Nummer dieser Layer mit in die DB geschrieben. Damit vereinfacht
> sich das Statement auf SELECT ... WHERE layer = <nummer>. Auf layer
> liegt natürlich ein Index. Ich habe den Eindruck, daß die DB jetzt den
> Index nutzt und die Tiles so deutlich schneller gerendert werden.
>
> Natürlich ist die Situation in einer universell verwendbaren Datenbank
> etwas komplizierter, aber es könnte Sinn machen, eine Vorauswertung für
> die Renderregeln jedes Projektes laufen zu lassen und das Ergebnis in
> einer Extratabelle zu speichern. Die Vorauswertung müßte für jeden
> Import bzw. Änderung der Regeln nur einmal laufen, dafür sind die
> ständig benutzten Statements beim Rendern schneller.

Wenn Du eh schon weisst, was auf welchem Layer ist und alles nur auf genau
einem Layer vorkommt, dann wäre es noch besser, für jeden Layer eine eigene
Tabelle anzulegen. Dann ists nämlich ganz klar, dass er den Geometrie-Index
auf dieser Tabelle benutzen kann. Bei der von Dir beschriebenen Lösung muss
sich die Datenbank entscheiden, ob sie den Geometrie-Index benutzt oder den
Layer-Index.

Jochen
-- 
Jochen Topf  jochen at remote.org  http://www.remote.org/jochen/  +49-721-388298