Я новичок в postgis, и у меня проблема с выполнением запросов.
Это мой запрос:
SELECT DISTINCT ON (userid) userid ,ST_AsText(position), timestamp
FROM table1
WHERE ST_Intersects ( ST_GeomFromText('a multiypolygon geom goes here',4326),position)
ORDER BY userid, timestamp desc
и проблема в том, что мой мультиполигон включает ОЧЕНЬ большие полигоны (600 страниц длиной в word doc!), и выполнение заняло более 2 часов!
Есть ли способ оптимизировать мой запрос или использовать другой способ?
Пожалуйста, ваша помощь очень ценится!
Это зависит от того, какое качество - точность вам нужна. Очевидно, что вы можете упростить полигоны, используя: http://postgis.net/docs/ST_Simplify.html
Во время разработки моего ГИС-приложения я часто думал о том, как лучше минимизировать данные. Например. например, предварительно выберите полигоны в граничной рамке. - В зависимости от уровня масштабирования вам не нужны сверхточные результаты (st_simplify), так что ...
Надеюсь, что это помогло вам немного!
источник
В зависимости от вашего опыта postgres и / или sql у вас есть несколько вариантов:
проанализируйте запрос с помощью команды EXPLAIN, чтобы выяснить, не достигли ли вы определенного узкого места. Предупреждение: иногда вывод EXPLAIN может быть трудным для понимания
если вы ожидаете, что большинство или значительная часть геометрий в таблице 1 НЕ пересекают мультиполигон, вы можете попытаться применить предварительное условие к более простому многоугольнику (то есть, разбив мультиполигон на более мелкие части), а затем запустить более тяжелое пересечение мультиполигона только на эти результаты. Смотрите ниже пример.
если и только если ЦП является узким местом (т. е. сервер застрял на пересечениях), я настоятельно рекомендую вам получить больший, более быстрый и более мощный ЦП или арендовать одноразовый экземпляр с высоким ЦП у Amazon EC2 и уничтожить его, когда вы сделанный
Пример запроса для позиции 2:Для повышения производительности вы также можете временно материализовать подвыбор st1 в виде таблицы, чтобы ее можно было проиндексировать.@Nicklas правильно указал в комментариях, что пример для предложения 2 не должен помочь. Он прав, но я думаю, что я (частично) тоже прав.
На самом деле, кажется, очень похожий вопрос был задан (и получен ответ) только в ноябре прошлого года на postgis ML:
http://postgis.refractions.net/pipermail/postgis-users/2011-November/031344.html
и оказывается, что предложение состоит в том, чтобы фактически разбить многоугольник, чтобы индекс мог наиболее эффективно отфильтровывать ложные пересечения, которые в противном случае были бы инициированы простой проверкой границы.
источник
С помощьюST_SubDivide()
Для версии 2.2 Postgis, вы можете использовать
ST_SubDivide
.Вы также можете
Здесь мы используем
ST_SubDivide
для разбиения многоугольника на подполигоны с 10 или менее вершинами.затем
Не делайте выше, это приводит к ошибкам округления
Генеральный Тюнинг
Также ознакомьтесь с разделом « Советы по повышению эффективности» в документации. Убедитесь, что вы настроены соответствующим образом. Рассмотрите возможность повышения,
max_parallel_workers_per_gather
чтобы воспользоваться преимуществами распараллеливания (в настоящее время по умолчанию отключено).источник