Как я могу улучшить полигональный запрос postgis

#sql #postgresql #geometry #postgis

Вопрос:

Я нахожу много примеров в Google, но многие из них старые …

Мой запрос, но в настоящее время выполнение занимает много времени, я думаю, что он может быть оптимизирован: я пытаюсь найти все геог, которые находятся в 1-точечном многоугольнике.

 table restaurant ( name text,
 longitude float,
latitude float, geog geometry);
 

и:

 CREATE INDEX if not exists idx_restaurant_geog ON restaurant USING gist (geog) ;
UPDATE restaurantSET geog = ST_Point(longitude,latitude);
 

Поэтому я преобразовал долготу и широту в геометрию.

вот запрос, который я использую, чтобы найти все рестораны, которые присутствуют в полигоне:

 select restaurant from poi where ST_Intersects(geog, ST_GeomFromGeoJSON(:s_polygoneDepartement)) = 'true'


:s_polygoneDepartement: is parameter 
 

благодарю вас

Комментарии:

1. Добавляются ли пространственные индексы? Можете ли вы описать таблицы? Что значит долгое время? Сколько записей вы просматриваете? Вы проанализировали запрос? Некоторые полезные комментарии можно найти здесь trac.osgeo.org/postgis/ticket/1798

2. У меня около 400 000 записей. время запроса длинное = 4,5 секунды. Я изменил этот запрос, который занимает 1,5 секунды, но я не уверен,что смогу улучшить его дальше: выберите * из ресторана, где ST_DWithin(geog, ST_GeomFromGeoJSON(:s_polygoneDepartement), 4326) »

3. Добавляются ли пространственные индексы? То есть сказать ? Я просто преобразовал долготу и широту в геометрию и добавил индекс

Ответ №1:

Ваш подход просто прекрасен. Создание gist индекса в столбце геометрии, как вы это сделали, является стандартной процедурой.

 CREATE INDEX idx_poi_geom ON poi USING gist (geom);

SELECT name,geom FROM poi 
WHERE ST_Contains('POLYGON((...))',geom);
 

Однако, в зависимости от варианта использования и распределения данных, вы можете взглянуть partial indexes или даже попытаться принудительно index only scan использовать INCLUDE предложение в вашем индексе, чтобы планировщику не нужно было искать данные в таблице. Но опять же, все зависит от вашего варианта использования.

ДЕМОНСТРАЦИЯ: db<>fiddle

Комментарии:

1. Хорошо, я проверю, потому что мой запрос слишком длинный для меня (около 1 секунды). Я постараюсь в эти выходные, и вы будете поддерживать связь

2. @Camel4488 есть успехи с индексом?