Страница 1 из 1
Подсчет количества пересекающихся геометрий
Добавлено: 20 окт 2011, 19:20
cesar
Понятно что есть ST_Intersects и можно найти объекты пересекающиеся с заданной геометрией. Также понятно что их можно подсчитать используя COUNT. Но если их много и запросов много то это будет не гуд совсем. Можно ли как то, более эффективно, подсчитать количество пересекающихся геометрий, может как то через индекс не выбирая данные с таблицу COUNT ом?
Re: Подсчет количества пересекающихся геометрий
Добавлено: 20 окт 2011, 19:33
Aleksandr Dezhin
Насколько я понимаю речь о пересечении геометрий в рамках одной таблицы.
Одним запросом можно сделать как-то так:
Код: Выделить всё
SELECT COUNT(*)
FROM tab t1, tab t2
WHERE t1.id > t2.id AND ST_Intersects(t1.geom, t2.geom)
Вместо id можно использовать и oid если они есть в таблице. В общем, смысл сравнения t1.id > t2.id в том, чтобы избежать попадания двух пар (t1, t2) и (t2, t1) а также самопересечений.
GIST-индекс в этом случае работать будет, но только на одном проходе - второй скорее всего будет выполняться через seq scan.
Re: Подсчет количества пересекающихся геометрий
Добавлено: 21 окт 2011, 10:29
cesar
SELECT COUNT(id)
FROM tab t1
WHERE ST_Intersects(t1.geom, POLIGON )
Вот так но если таких запросов много, и если в область попадает много совпадений то то COUNT(*) работает не достаточно быстро.
Re: Подсчет количества пересекающихся геометрий
Добавлено: 21 окт 2011, 11:45
cesar
а по oid быстрее будет? вобще нету но можно организовать.
Re: Подсчет количества пересекающихся геометрий
Добавлено: 21 окт 2011, 11:56
Aleksandr Dezhin
COUNT(*) работает достаточно быстро. А вот ST_Intersects может без индекса довольно сильно тормозить. Индекс то вы создали? Если геометрии с которыми нужно проверить пересечения лежат в отдельной таблице, то опять таки можно одним запросом.
Re: Подсчет количества пересекающихся геометрий
Добавлено: 21 окт 2011, 12:40
cesar
геометрия лежит в общей таблице с кучей полей, знаю что не гуд сейчас провожу на таблицах с минимальным количеством полей, индексы созданы просто если после ST_Intersects надо посчитать COUNT(*) а ST_Intersects выдает по 50 000 совпадений и таких запросов с 10 одновременно то это медленно.
Попробовал COUNT(oid) работает практически одинаково COUNT(id).