Страница 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).