From: Sandro Santilli Date: Tue, 30 Dec 2014 09:16:34 +0000 (+0000) Subject: Allow index scans in edge splitting and healing queries (#3000) X-Git-Tag: 2.2.0rc1~715 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1882319ac0cfbc571584cec6b260c2c98b547aa3;p=postgis Allow index scans in edge splitting and healing queries (#3000) Speeds up topology population when input edges intersect. A simple test splitting and re-healing an edge in a ~500k edges topology completes in ~1/10 of the time. git-svn-id: http://svn.osgeo.org/postgis/trunk@13166 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/topology/sql/sqlmm.sql.in b/topology/sql/sqlmm.sql.in index 138848f75..79e1bd241 100644 --- a/topology/sql/sqlmm.sql.in +++ b/topology/sql/sqlmm.sql.in @@ -357,6 +357,11 @@ BEGIN || ', next_left_edge = ' || e2sign*newedgeid || '*(next_left_edge/' || e2id || ') WHERE abs_next_left_edge = ' || e2id; + IF e2rec.start_node = commonnode THEN + sql := sql || ' AND end_node = ' || e2rec.end_node; + ELSE + sql := sql || ' AND end_node = ' || e2rec.start_node; + END IF; --RAISE DEBUG 'SQL: %', sql; EXECUTE sql; sql := 'UPDATE ' || quote_ident(toponame) @@ -364,6 +369,11 @@ BEGIN || ', next_right_edge = ' || e2sign*newedgeid || '*(next_right_edge/' || e2id || ') WHERE abs_next_right_edge = ' || e2id; + IF e2rec.start_node = commonnode THEN + sql := sql || ' AND start_node = ' || e2rec.end_node; + ELSE + sql := sql || ' AND start_node = ' || e2rec.start_node; + END IF; --RAISE DEBUG 'SQL: %', sql; EXECUTE sql; @@ -373,6 +383,11 @@ BEGIN || ', next_left_edge = ' || newedgeid || '*(next_left_edge/' || e1id || ') WHERE abs_next_left_edge = ' || e1id; + IF e1rec.start_node = commonnode THEN + sql := sql || ' AND end_node = ' || e1rec.end_node; + ELSE + sql := sql || ' AND end_node = ' || e1rec.start_node; + END IF; --RAISE DEBUG 'SQL: %', sql; EXECUTE sql; sql := 'UPDATE ' || quote_ident(toponame) @@ -380,6 +395,11 @@ BEGIN || ', next_right_edge = ' || newedgeid || '*(next_right_edge/' || e1id || ') WHERE abs_next_right_edge = ' || e1id; + IF e1rec.start_node = commonnode THEN + sql := sql || ' AND start_node = ' || e1rec.end_node; + ELSE + sql := sql || ' AND start_node = ' || e1rec.start_node; + END IF; --RAISE DEBUG 'SQL: %', sql; EXECUTE sql; @@ -643,6 +663,11 @@ BEGIN || ', next_left_edge = ' || e2sign*e1id || '*(next_left_edge/' || e2id || ') WHERE abs_next_left_edge = ' || e2id; + IF e2rec.start_node = commonnode THEN + sql := sql || ' AND end_node = ' || e2rec.end_node; + ELSE + sql := sql || ' AND end_node = ' || e2rec.start_node; + END IF; --RAISE DEBUG 'SQL: %', sql; EXECUTE sql; sql := 'UPDATE ' || quote_ident(toponame) @@ -650,6 +675,11 @@ BEGIN || ', next_right_edge = ' || e2sign*e1id || '*(next_right_edge/' || e2id || ') WHERE abs_next_right_edge = ' || e2id; + IF e2rec.start_node = commonnode THEN + sql := sql || ' AND start_node = ' || e2rec.end_node; + ELSE + sql := sql || ' AND start_node = ' || e2rec.start_node; + END IF; --RAISE DEBUG 'SQL: %', sql; EXECUTE sql; @@ -1966,6 +1996,7 @@ BEGIN || ',' || ' abs_next_right_edge = ' || edgeid2 || ' WHERE next_right_edge = ' || anedge + || ' AND start_node = ' || oldedge.start_node || ' AND edge_id NOT IN (' || edgeid1 || ',' || edgeid2 || ')' ; EXECUTE 'UPDATE ' || quote_ident(atopology) @@ -1974,6 +2005,7 @@ BEGIN || ',' || ' abs_next_right_edge = ' || edgeid1 || ' WHERE next_right_edge = ' || -anedge + || ' AND start_node = ' || oldedge.end_node || ' AND edge_id NOT IN (' || edgeid1 || ',' || edgeid2 || ')' ; @@ -1983,6 +2015,7 @@ BEGIN || ',' || ' abs_next_left_edge = ' || edgeid1 || ' WHERE next_left_edge = ' || anedge + || ' AND end_node = ' || oldedge.start_node || ' AND edge_id NOT IN (' || edgeid1 || ',' || edgeid2 || ')' ; EXECUTE 'UPDATE ' || quote_ident(atopology) @@ -1991,6 +2024,7 @@ BEGIN || ',' || ' abs_next_left_edge = ' || edgeid2 || ' WHERE next_left_edge = ' || -anedge + || ' AND end_node = ' || oldedge.end_node || ' AND edge_id NOT IN (' || edgeid1 || ',' || edgeid2 || ')' ; @@ -2230,7 +2264,8 @@ BEGIN || ',' || ' abs_next_right_edge = ' || newedgeid || ' WHERE edge_id != ' || newedgeid - || ' AND next_right_edge = ' || -anedge; + || ' AND next_right_edge = ' || -anedge + || ' AND start_node = ' || oldedge.end_node; EXECUTE 'UPDATE ' || quote_ident(atopology) || '.edge_data SET ' @@ -2238,7 +2273,8 @@ BEGIN || ',' || ' abs_next_left_edge = ' || newedgeid || ' WHERE edge_id != ' || newedgeid - || ' AND next_left_edge = ' || -anedge; + || ' AND next_left_edge = ' || -anedge + || ' AND end_node = ' || oldedge.end_node; -- -- Update references in the Relation table.