[postgis-users] Slow Postgres Query

Paragon Corporation lr at pcorp.us
Fri Oct 2 20:43:11 PDT 2009


You should use ST_DWithin if you can.  That select limit 1 will be really
slow with a large table.

 
(SELECT gid
	from twothousandlines
		WHERE ST_DWithin(twothousandlines.geom,sixtypoints.geom,
some_reasonable_buffer_dist)
	order by st_distance(twothousandlines.geom,sixtypoints.geom)
	limit 1
)

Leo

-----Original Message-----
From: postgis-users-bounces at postgis.refractions.net
[mailto:postgis-users-bounces at postgis.refractions.net] On Behalf Of Randall,
Eric
Sent: Friday, October 02, 2009 4:24 PM
To: PostGIS Users Discussion
Subject: Re: [postgis-users] Slow Postgres Query

Thanks Stanly! So to make it a single step I guess...

create table lines_from_points_and_points_projected_onto_centerlines as
select gid as point_id, (SELECT gid
	from twothousandlines
	order by st_distance(twothousandlines.geom,sixtypoints.geom)
	limit 1
) as line_id,
(SELECT
st_makeline(sixtypoints.geom,st_line_interpolate_point(st_geometryn(twothous
andlines.geom,1),st_line_locate_point(st_geometryn(twothousandlines.geom,1),
sixtypoints.geom)))
	from twothousandlines
	order by st_distance(twothousandlines.geom,sixtypoints.geom)
	limit 1
) as geom
from sixtypoints




-Eric



Eric Randall

-----Original Message-----
From: postgis-users-bounces at postgis.refractions.net
[mailto:postgis-users-bounces at postgis.refractions.net]On Behalf Of
Sufficool, Stanley
Sent: Friday, October 02, 2009 3:32 PM
To: PostGIS Users Discussion
Subject: Re: [postgis-users] Slow Postgres Query


I usually avoid cursors when possible:

insert into linespoints (point_id, nearest_line_id) select gid, (
	SELECT gid
	from twothousandlines
	order by st_distance(twothousandlines.geom,sixtypoints.geom)
	limit 1
)
from sixtypoints


> -----Original Message-----
> From: postgis-users-bounces at postgis.refractions.net
> [mailto:postgis-users-bounces at postgis.refractions.net] On Behalf Of 
> Randall, Eric
> Sent: Friday, October 02, 2009 10:20 AM
> To: PostGIS Users Discussion
> Subject: Re: [postgis-users] Slow Postgres Query
> 
> 
> Hi there dassouki,
> 
> Right, no way that should take so long.  I created 60 point and 2000 
> line tables from addresses and road centerlines to do a test.  The 
> tables are called "sixtypoints" and "twothousandlines".  Then created 
> a "linespoints" table to store point and nearest line ids:
> 
> /*
> create table linespoints (
> point_id integer,
> nearest_line_id integer );
> */
> 
> Then created a function to insert the point and nearest line ids:
> 
> /*
> create or replace function insert_into_linespoints() returns integer 
> as $$
> 
> 	declare
> 		
>         getrow cursor for select * from sixtypoints;
>         
>         point_row sixtypoints%rowtype;
>         
>         v_nearest_line_id integer;     
>         max_rows integer;
> 	  rowcount integer;
> 		
> 	begin
> 
> 	  delete from  linespoints;
> 	
>         select into max_rows count(*) from sixtypoints;
> 
> 	  open getrow;
>         rowcount := 0;
>         
>         while rowcount < max_rows LOOP   --of course, could 
> have just said 60
>                
>         fetch getrow into point_row;
>         rowcount := rowcount + 1;
>         
>         select into v_nearest_line_id 
>         twothousandlines.gid
>         from  twothousandlines
>         order by st_distance(twothousandlines.geom,point_row.geom) 
>         limit 1;        
> 
>         insert into linespoints values (point_row.gid, 
> v_nearest_line_id );
> 	   
>         end loop;
> 	  close getrow;
> 	  return(rowcount);
> 		
>      end;
> 
> $$ language plpgsql
> 
> */
> 
> 
> Then ran it:
> 
> /*
> select insert_into_linespoints()   --389ms
> */
> 
> Then made lines from info in the three tables: 
> 
> /*
> select
> st_makeline(sixtypoints.geom,st_line_interpolate_point(st_geom
> etryn(twothousandlines.geom,1),st_line_locate_point(st_geometr
> yn(twothousandlines.geom,1),sixtypoints.geom)))
> from twothousandlines, sixtypoints, linespoints where sixtypoints.gid 
> = linespoints.point_id and twothousandlines.gid = 
> linespoints.nearest_line_id */ --12ms
> 
> 
> In retrospect, I probably would add a geometry column to the 
> "linespoints" table and insert the line during the function 
> rather than having the third step.  I didn't understand why 
> you needed to "explode" to linestrings as you called it but I 
> guess it has to do with your data.  The "order by 
> st_distance() ... limit 1"  is what you needed mainly I think 
> to give you each single nearest line.
> 
> 
> Hopefully this is what you're trying to do.
> 
> 
> Eric
> 
> 
> 
> Eric Randall
> 
> -----Original Message-----
> From: postgis-users-bounces at postgis.refractions.net
> [mailto:postgis-users-bounces at postgis.refractions.net]On 
> Behalf Of dassouki
> Sent: Thursday, October 01, 2009 11:38 AM
> To: postgis-users at postgis.refractions.net
> Subject: [postgis-users] Slow Postgres Query
> 
> 
> Hey All,
> 
> As some of you know, I've been trying to connect a point from a point 
> table to the projection of that point on the nearest line for 
> close to 
> forever now.
> 
> I've managed to get the code working for a small set of points and 
> lines; however, on a 60 node with 2,000 lines, the query is 
> in its 11th 
> hour and still no sign of ending.
> 
> I posted a question including code on stack overflow 
> http://stackoverflow.com/questions/1504353/slow-postgres-query
> 
> I was wondering if anyone here has any idea on what I might be doing 
> wrong ? and if there is a way to make the code more efficient
> 
> 
> cheers,
> dassouki
> 
> 
> _______________________________________________
> postgis-users mailing list postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
> _______________________________________________
> postgis-users mailing list postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
> 
_______________________________________________
postgis-users mailing list
postgis-users at postgis.refractions.net
http://postgis.refractions.net/mailman/listinfo/postgis-users
_______________________________________________
postgis-users mailing list
postgis-users at postgis.refractions.net
http://postgis.refractions.net/mailman/listinfo/postgis-users





More information about the postgis-users mailing list