[OSM-Devserver] Partitionierung

Kai Krueger kakrueger at gmail.com
Mo Apr 12 15:35:27 CEST 2010


On 12/04/10 12:30, Frederik Ramm wrote:
> Hallo,
>
> Kai Krueger wrote:
>> Ohne index benoetigt der querry ca 960ms,
>> Fuer "where highway is not null" is es dann ca. 930ms
>> und bei dem vollen "where highway in
>> ('motorway','motorway_link','trunk','trunk_link','primary','primary_link','secondary','secondary_link','tertiary','tertiary_link','residential','unclassified','minor','road','service','pedestrian','raceway','living_street')"
>> sind es immer noch 850ms.
>
> Wenn Du das Test-Setup noch da hast, gib uns mal die Vergleichszahl fuer
> ohne "order by z_order". Ich glaub naemlich, das ist der Boesewicht.

Ich habe die Zahlen jetzt nicht direkt parat, kann sie aber spaeter noch mal 
anschauen. Der sort auf z_order war aber definitive einer der grossen Teile. Die 
verteilung war wenn ich mich richtig erinnere sehr grob ca 30 ms fuer den bitmap 
Index scan, dann noch mal 300 - 400 ms fuer den Bitmap heap lookup der treffer 
des index scans und die restilichen 300 - 400 ms waren der sort. Das ganze war 
nach mehr maliger ausfuehrung, also als alles bereits in den Caches war. Mit 
kalten caches, (z.B. weil der ganze planet nicht ins Ram passt) sieht die Sache 
moeglicherweise wieder ganz anders aus.

Der highway is not null index hilft aber warscheinlich nicht sonderlich, da der 
die ueberwiegende Anzahl der rows in der Tabelle planet_osm_line anscheinend 
einen highway Eintrag haben, das heist der partielle index fast so gross ist wie 
der volle index. Bei anderen nicht so haeufig verwendeten tags sieht es also 
moeglicherweise recht anders aus, siehe eben den waterway query.

>
>> Und das waren schon die recht einfachen queries. Viele der queries die
>> mapnik macht haben wesentlich mehr "or" Verknuepfungen, so dass man im
>> Prinzip fuer jeden querry (und davon gibt es viele) einen separaten
>> index benoetigt.
>
> Ich dachte, dass wir nicht primaer ueber eine Optimierung fuers
> Rendering reden, sondern allgemein? Was Mapnik betrifft hast Du zwar
> recht, andrerseits sind es auf jedem Zoomlevel doch einige wenige
> Queries, die den Loewenanteil der Zeit verbrauchen, und da lohnt es sich
> schon, ein bisschen zu feilen.

Das war aus deiner email nicht so ganz klar was wir genau optimieren wollen. Ich 
hatte zwar angenommen das du es allgemeiner meinst, aber es ist halt sehr schwer 
optimierungen zu diskutieren, wenn man nicht weis was man eigentlich optimieren 
will. Deshalb habe ich das Beispiel des mapnik renderers verwendet.

Es sind zwar in der Tat nicht so viele, aber immernoch eine nenneswerte Anzahl, 
und wie zumindestens dieses eine Beispiel zeigt, sind bei manchen von denen auch 
wenn man fuer bestimmte querries optimiert nicht so viel extra performance 
herauszuholen, da die querries einfach zu komplex sind bzw zuviele daten laden 
und desshalb mehr zeit in sachen wie den sorts verbringen als was man mit 
indexen erreichen kann. (das Beispiel war ein recht weit heraus gezoomte 
metatile von London, also von hoher Datenkomplexitaet, laendlich highzoom tiles 
sehen also auch wieder ganz anders aus)

Aber das ganze haengt halt wirklich extrem davon ab genau welche querries man 
macht, sodas es extrem schwierig sein duerfte "generelle" optimierungen zu 
finden ohne eben genau im Auge zu haben was man damit vor hat. Fuer weltweite 
POI abfragen z.B. ist das jetztige schema natuerlich recht ungeeignet und extra 
indexe wuerden viel helfen.

Desshalb muss man halt schauen wo die praktischen bottlenecks sind, getreu des 
Mottos "premature optimization is the root of all evil...".

>
>> Nicht nur verliert man dann also bei den Updates, da man wesentlich
>> mehr indexe pflegen muss,
>
> Probiere das aber mal aus. Der create index fuer so einen partial index
> dauert auf dem ganzen Planeten (!) in der Regel nur wenige Sekunden. Ist
> das nicht Anlass zur Annahme, dass auch die Aktualisierung solcher
> Indexe nicht allzu teuer sein kann?

Ein minutely diff kann locker mal ein paar tausend eintraege haben. Da der index 
bei jedem update einzeln veraendert werden muss, kann auch sehr kleine zeiten 
sich schnell aufsummieren. Ob das in diesem Fall eine Rolle spielt? Keine 
Ahnung, muesste man ausprobieren. Allerdings aus einem anderen Beispiel weis ich 
das es durchaus das potential hat etwas auszumachen. Ein Import von z.B. einem 
UK extract mit Osmosis in ein api-06 schema hat jedenfalls wenn ich mich richtig 
errinnere weniger als die haelfte der Zeit benoetigt, nachdem man alle Indexe 
zuvor gedropt hatte. (Und die zeit war sogar inclusive neu Erzeugung des Index 
am Ende).

>
>> Bevor man irgendwelche indexe hinzufuegt sollte man also recht genau
>> eine statistische Analyse machen, welche Abfragen im Durchschnitt ab
>> meisten Zeit benoetigen ( also die Kombination aus wie haeufig werden
>> die Abfragen verwendet und wie lange braucht jede davon) und ob das
>> insgesamt prozentual ein nennenswerter Anteil des Gesamten ist.
>
> Wobei, wenn ich es richtig verstanden habe, hier das Ziel ja nicht so
> spezifisch war.

Wie gesagt, dann duerfte es halt recht schwer werden dafuer sinnvolle 
Optimierungen zu finden.

Im uebrigen zum urspruenglichen Thema partitionierung. Das Osm2Pgsql schema ist 
bereits in 4 teile partitioniert, naemlich in planet_osm_points, 
planet_osm_polygon, planet_osm_line und planet_osm_roads. Der code muesste also 
eigentlich schon vorhanden sein, denn zumindestens die partitionierung in 
planet_osm_line und planet_osm_roads muesste eigentlich die von dir erwaehnten 
Probleme auch loesen. Man koennte also testweise mal einen highway=footway in 
einen highway=motorway umtaggen und sehen ob das korrekt funktioniert.

>
> Bye
> Frederik


Kai