[OSM-Devserver] Schnelleres Rendern durch Preprozessing

Nop ekkehart at gmx.de
Mo Mai 17 22:55:27 CEST 2010



Hi!

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.

bye
	Nop