Eureka! was Re: [OSM-dev] SQL optimisation

Nick Hill nick at
Sat Apr 8 22:01:38 BST 2006

I have written a test suite which creates a random gpx field then runs
queries on it. With an initial test using just over 1 million points and
a 20x20 integer grid, returning a record set of around 800 points per
tile, I am seeing an improvement of ten fold. With a finer grained tile 
set, I may see even better results.

I will create a 10 million point pattern then run queries on that. I'll
post my perl test suite here.

Nick Hill wrote:
> Nick Hill wrote:
>> When querying the database, use a query like:
>> select distinctrow latitude, longitude from gps_points where 
>> latitude_int>(int(#{lat1}*100) and latitude_int<(int(#{lat2}*100) and 
>> longitude_int>(int(#{lon1}*100) and longitude_int<(int(#{lon2}*100) 
>> and latitude > #{lat1} and latitude < #{lat2} and longitude > #{lon1} 
>> and longitude < #{lon2}
> When comparing latitude_int and longitude_int we are using whole numbers 
> so need to either add/subtract 1 or use >= or <=
> So the query becomes instead:
> ...latitude_int>(int(#{lat1}*100)-1) and 
> latitude_int<(int(#{lat2}*100)+1) and longitude_int>(int(#{lon1}*100)-1) 
> and longitude_int<(int(#{lon2}*100)+1) and ...

More information about the dev mailing list