Какая у вас версия PostgreSQL: 8.0, 8.1 и т. Д.? Если у вас «старшая версия», вы можете попробовать включить столбец lat и lon в качестве уникального столбца типа точки . Как это:
create table MyTable (
...
lat integer,
lon integer,
coor point,
...
);
insert MyTable (..., lat, lon, coor, ...) values (..., lat1, lon1, '(lat1, lon1)', ...)
...
И создайте индексы, необходимые для проверки:
create index MyTable_lat on MyTable (lat);
create index MyTable_lon on MyTable (lon);
create index MyTable_coor on MyTable using gist (coor);
Теперь вы можете проверить, какой тип запроса выполняется быстрее:
explain analyze
select *
from MyTable
where lat < :maxlat and lat > :minlat
and lon < :maxlon and lon > :minlon
Или:
explain analyze
select *
from MyTable
where coor <@ box '((:minlat,:minlon),(:maxlat,:maxlon))'
Я провел тест на PostgreSQL 9 (с 20000 записями), и второй вариант стал быстрее.