]> granicus.if.org Git - postgis/commitdiff
Allow index scans in edge splitting and healing queries (#3000)
authorSandro Santilli <strk@keybit.net>
Tue, 30 Dec 2014 09:16:34 +0000 (09:16 +0000)
committerSandro Santilli <strk@keybit.net>
Tue, 30 Dec 2014 09:16:34 +0000 (09:16 +0000)
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

topology/sql/sqlmm.sql.in

index 138848f75d00e25223c1c7040b9a3147ad806bcf..79e1bd2414d7faead21aa0a5de3960bd02f3d7cc 100644 (file)
@@ -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.