[pgrouting-users] Performance problems with pgr_dijkstra

Eric Scheibler email at eric-scheibler.de
Wed Feb 11 12:39:33 PST 2015


Eric Scheibler <email at eric-scheibler.de> schrieb am 11.02.2015, 12:23 +0100:
>Daniel Kastl <daniel at georepublic.de> schrieb am 11.02.2015, 10:54 +0900:
>>You're right, that with pgRouting the amount of data selected from the
>>network table matters. And the fastest way to select only a part of the
>>network table is by selecting a bounding box. You should have an index on
>>your geometry column as well. Then you don't need to create temporary
>>tables.
>
>Do you have an example for a bounding box? How to determine the box size? I know the distance
>between the starting and destination point in meters. Could that be used?

Found that, works.

>>Back to your question: as far as I remember, the size of ID's can matter. I
>>experienced this when I used data, that had already source and target ID's
>>in place, which all had the same number of digits. Renumbering (starting
>>from 1) helped to improve the speed. Though I can't tell this is the reason
>>in your case.
>
>Very interesting. You could be right. I created a temp routing table in the Saxony database, took
>start and destination vertex from my program and verified the process time and the result (4 rows
>and 60 ms for a very short way, approximately 100 meters). Then I dumped the created table with
>pg_dump and restored it into the Europe database. Now the same routing query runs as fast as in the
>small database. So maybe the higher source and target id's are responsible for that.

Yes, that solved the problem. Now the routing query completes after 30-40 ms. So it's even a bit
faster than at the small database. I've created a SQL function, which recreates the source and
target id's of the temp routing table:

CREATE OR REPLACE FUNCTION recreate_vertex_of_routing_table(regclass)
RETURNS void
AS $$
DECLARE
    row RECORD;
    vertex_storage hstore;
    new_vertex int;
BEGIN
    vertex_storage := ''::hstore;
    new_vertex := 1;
    FOR row in EXECUTE FORMAT('SELECT id, source, target FROM %I', $1)
    LOOP
        IF NOT vertex_storage ? row.source::text THEN
            vertex_storage = vertex_storage || (row.source::text => new_vertex::text);
            new_vertex := new_vertex + 1;
        END IF;
        IF NOT vertex_storage ? row.target::text THEN
            vertex_storage = vertex_storage || (row.target::text => new_vertex::text);
            new_vertex := new_vertex + 1;
        END IF;
    END LOOP;
    FOR row IN SELECT key, value FROM EACH(vertex_storage)
    LOOP
        EXECUTE FORMAT('UPDATE %I SET source=$1 WHERE source = $2', $1) USING row.value::int, row.key::int;
        EXECUTE FORMAT('UPDATE %I SET target=$1 WHERE target = $2', $1) USING row.value::int, row.key::int;
    END LOOP;
END;
$$ LANGUAGE plpgsql;

Best regards
Eric
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: Digital signature
URL: <http://lists.osgeo.org/pipermail/pgrouting-users/attachments/20150211/d33fef4d/attachment.pgp>


More information about the Pgrouting-users mailing list