Я пытаюсь использовать новую функцию Postgis 2.0 <-> (Geroidry Distance Centroid), чтобы вычислить для каждой строки моей таблицы (cosn1) расстояние до ближайшего многоугольника того же класса.
Я пытался использовать следующий код:
WITH index_query AS (
SELECT g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN
FROM "cosn1" As g1, "cosn1" As g2
WHERE g1.gid <> g2.gid AND g1.class = g2.class
ORDER BY g1.gid, g1.the_geom <-> g2.the_geom)
SELECT DISTINCT ON (ref_gid) ref_gid, ENN
FROM index_query
ORDER BY ref_gid, ENN;
Но потом я понимаю предупреждение:
Примечание. Индекс включается только в том случае, если одна из геометрий является константой (не в подзапросе / cte). например, 'SRID = 3005; POINT (1011102 450541)' :: геометрия вместо a.geom
Это означает, что индекс не будет использоваться вообще, и запрос будет занимать почти то же время, что и перед использованием:
SELECT DISTINCT ON(g1.gid) g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN
FROM "cosn1" As g1, "cosn1" As g2
WHERE g1.gid <> g2.gid AND g1.class = g2.class
ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom)
Может кто-нибудь указать мне обходной путь, который позволяет мне улучшить производительность моего запроса?
Большое спасибо.
nearest-neighbor
postgis-2.0
Александр Нето
источник
источник
Ответы:
Хум, проводящий некоторые тесты на моей машине, звучал так, как будто этот оператор <-> не работает должным образом. Я не уверен, что это ошибка, но он сообщил о нулевом расстоянии на неперекрывающихся геометриях. Интригует нет?
А как насчет справедливых традиционных оптимизаций SQL-запросов? Поскольку эти неожиданные результаты с оператором <->, я заменяю его на st_centroid. Получил намного лучшие результаты в скорости.
Надеюсь, что семантика с st_overlaps останется прежней. По крайней мере, это я понял из документации о <->
Из документов по Postigs <->
В моих тестовых данных с ~ 5,5 тыс. Полигонов скорость возросла с ~ 1000 до ~ 5 секунд без пространственной индексации.
В любом случае, зачем использовать DISTINCT ON для группировки? Я вижу, что некоторые люди используют его, но не существует группа, которая существует для устранения дубликатов?
Ваш запрос со стандартными оптимизациями SQL без введенной ошибки st_centroid
Счастливого Рождества!
источник