Пространственный индекс против двух координатных индексов - PullRequest
4 голосов
/ 09 февраля 2012

У меня есть таблица с двумя столбцами: широта и долгота.Я хочу получить все объекты внутри «прямоугольной» (ну, прямоугольной в координатной метке широта / долгота) границы: минимальная-максимальная широта и минимальная-максимальная долгота.В основном это сводится к следующему псевдо-SQL:

SELECT * FROM MyTable WHERE lat < :maxlat AND lat > :minlat 
    AND lon < :maxlon AND lon > :minlon

Какое лучшее решение для индексации моей таблицы?Двухколонный индекс?Два индекса по двум столбцам?Пространственный индекс?

Я хотел бы знать, действительно ли нужен пространственный индекс в этом случае, поскольку вам нужен специальный столбец, определенные библиотеки, и все это за счет переносимости и простоты базы данных.

Примечание: я бы хотел оставить этот вопрос независимым от базы данных, но для полноты картины упомяну тот факт, что я работаю с PostGreSQL 8 без (на данный момент) PostGIS.

1 Ответ

1 голос
/ 09 февраля 2012

Какая у вас версия 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 записями), и второй вариант стал быстрее.

...