У меня есть таблица:
create table test_coordinates(
coordinates geometry,
radius integer not null default random() * 20000 + 1000
);
Это заданные точки с радиусами - по существу, кругами.
Я хочу увидеть, в каких кругах находится данная точка, на поверхности Земли,Я хочу использовать индекс для этого, поэтому я делаю запрос следующим образом:
select * from test_coordinates
where st_covers(st_buffer(
coordinates::geography,
radius,
st_makepoint(59.91033806688409, 10.74357882142067));
И индексирую таблицу следующим образом:
create index "polygon_index" on test_coordinates
using gist(st_buffer(
coordinates::geography,
radius));
Как показывает analyze explain
, запрос используетиндекс. Все идет нормально. Но, зная, что st_buffer
образует вписанный многоугольник, так что это обрезает некоторые результаты, я хочу немного расширить свой буфер, добавив к нему 5% радиуса. Теперь индекс и запрос будут выглядеть следующим образом:
create index "polygon_index" on test_coordinates
using gist(st_buffer(
coordinates::geography,
radius + radius / 20));
explain analyse select * from test_coordinates
where st_covers(st_buffer(
coordinates::geography,
radius + radius / 20), -- note: don't mind that it's not precise; in reality it's followed by st_dwithin
st_makepoint(59.91033806688409, 10.74357882142067));
Удивительно, но индекс сейчас не используется. Добавление + radius / 20
предотвращает его использование каким-либо образом. Почему это происходит?
Единственный способ решить эту невозможность добавить что-то к найденному радиусу - это изменить сам тип столбца координат:
alter table test_coordinates alter column coordinates type geography;
Затем, если я удаляю все приведения к geography
сверху, добавление + radius / 20
к индексу и запросу не мешает использованию индекса. Почему изменение типа столбца работает, а простое приведение в запросах и индекс не работает? Это ошибка? Есть ли способ сделать это без изменения типа столбца?