Странное поведение выражения index - PullRequest
0 голосов
/ 08 октября 2019

У меня есть таблица:

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 к индексу и запросу не мешает использованию индекса. Почему изменение типа столбца работает, а простое приведение в запросах и индекс не работает? Это ошибка? Есть ли способ сделать это без изменения типа столбца?

...