x

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: