Postgresql Abfragezeit
Geschrieben von viw (Gast) am 11. Dezember 2011 12:58:10: [flux]
Hallo,
ich habe die Postgresqlfunktion zum testen von Key Value Paaren etwas erweitert:
CREATE␣OR␣REPLACE␣FUNCTION␣c_v(planet_osm_ways.tags%TYPE,␣text[][]) RETURNS␣boolean␣AS' DECLARE
BEGIN if␣array_upper($1,1)<2␣THEN Return␣false; END␣IF; FOR␣i␣IN␣1..(array_upper($1,1))␣LOOP
if␣($1[i]=$2[1][1]␣and␣$1[i+1]=$2[1][2])␣Then Return␣true; END␣IF; i:=i+1;
END␣LOOP; Return␣false; END; '␣LANGUAGE␣plpgsql
Außerdem gibt es noch eine Funktion
CREATE␣OR␣REPLACE␣FUNCTION␣c_k_v(planet_osm_ways.tags%TYPE,␣text[][]) RETURNS␣boolean␣AS' DECLARE
BEGIN if␣array_upper($1,1)<2␣THEN Return␣false; END␣IF; FOR␣i␣IN␣1..(array_upper($1,1))␣LOOP FOR␣j␣IN␣1..(array_upper($2,1))␣LOOP if␣($1[i]=$2[j][1]␣and␣$1[i+1]=$2[j][2])␣Then Return␣true; END␣IF; i:=i+1; j:=j+1; END␣LOOP; END␣LOOP; Return␣false; END; '␣LANGUAGE␣plpgsql
Beide Funktionen arbeiten einwandfrei. Allerdings verstehe ich nicht warum es so große zeitliche Unterschiede beim Ausführen der beiden Funktionen gibt.
Die Abfragen
select␣*␣FROM␣planet_osm_rels␣where␣c_v(tags,'{{"route","tram"}}')␣OR␣c_v(tags,'{{"route","bus"}}'); select␣*␣FROM␣planet_osm_rels␣where␣c_k_v(tags,'{{"route","tram"},{"route","bus"}}');
liefern das gleiche Ergebnis. Allerdings ist die erste Abfrage fast doppelt so schnell und liefert die 439 Zeilen in 1121 ms während die zweite Abfrage 2086 ms benötigt.
Getestet habe ich es mit einer osm2pgsql Datenbank in welches ich das Bundesland Sachsen mit dem Parameter --slim geladen habe.
Antworten:
- Re: Postgresql Abfragezeit · wambacher (Gast) · 11.12.2011 14:00 [flux]
- Re: Postgresql Abfragezeit · viw (Gast) · 11.12.2011 14:11 [flux]
- Re: Postgresql Abfragezeit · maxbe (Gast) · 11.12.2011 14:18 [flux]
- Re: Postgresql Abfragezeit · viw (Gast) · 11.12.2011 14:32 [flux]
- Re: Postgresql Abfragezeit · wambacher (Gast) · 11.12.2011 14:40 [flux]