У меня есть таблица многоугольников (тысячи) и таблица точек (миллионы).Обе таблицы имеют индексы GIST для столбцов геометрии.Важно то, что полигоны не перекрываются, поэтому каждая точка содержится ровно в одном полигоне .Я хочу сгенерировать таблицу с этим отношением (polygon_id + point_id).
Тривиальное решение, конечно, это
SELECT a.polygon_id, p.point_id
FROM my_polygons a
JOIN my_points p ON ST_Contains(a.geom, p.geom)
Это работает, но я думаю, что это не нужно медленно, так как оно соответствует каждому многоугольникус каждой точкой - он не знает, что каждая точка может принадлежать только одному многоугольнику.
Есть ли способ ускорить процесс?
Я пробовал цикл для каждогомногоугольник, выбирающий точки с помощью ST_Contains, но только те, которых еще нет в таблице результатов:
CREATE TABLE polygon2point (polygon_id uuid, point_id uuid);
DO $$DECLARE r record;
BEGIN
FOR r IN SELECT polygon_id, geom
FROM my_polygon
LOOP
INSERT INTO polygon2point (polygon_id, point_id)
SELECT r.polygon_id, p.point_id
FROM my_points p
LEFT JOIN polygon2point t ON p.point_id = t.point_id
WHERE t.point_id IS NULL AND ST_Contains(r.geom, p.geom);
END LOOP;
END$$;
Это даже медленнее, чем тривиальный подход JOIN.Есть идеи?