Соединение таблиц SQL Server с атрибутами Geometry выполняется очень медленно. Является ли это наиболее эффективным способом? - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть две таблицы MS SQL Server ( v11.0 ) с типами данных Geometry. У одного ~ 8000 точечных записей, у другого ~ 100 многоугольных записей.

Обе таблицы имеют пространственные индексы в соответствующем столбце геометрии, и обе используют один и тот же SRID.

Для указанной цели отчетности мне нужно извлечь список имен всех точек с именем многоугольника, внутри которого он лежит. Все точки находятся в пределах один от полигонов. Полигоны не перекрываются.

Я использую этот запрос:

SELECT points.point_label, polygons.polygon_label
FROM 
points WITH (NOLOCK) INNER JOIN
polygons WITH (NOLOCK) ON 
polygons.polygon_geometry.STContains(points.point_geometry) = 1

Работает, но очень медленно возвращает все ~ 8000 точек строк с меткой, содержащей полигон.

Есть ли более эффективный способ присоединиться к ним для достижения желаемого результата? Разве SQL Server не очень хорош для вычисления геометрических элементов по наборам данных? Большинство примеров кода, которые я вижу, включают в себя переменную типа geometry с одним оперируемым значением.

1 Ответ

0 голосов
/ 11 сентября 2018

Это полностью SWAG, но, исходя из вашего описания ваших данных, я бы попробовал это:

SELECT points.point_label, p.polygon_label FROM points outer apply ( select top(1) polygon_label from polygons where polygons.polygon_geometry.STContains(points.point_geometry) = 1 ) as p

Вы даете SQL-разрешение прекратить присматривать за егонашел не более одного многоугольника, который включает точку.

Примечание: единственная причина, по которой я публикую это как ответ, а не комментарий, - это форматирование и длина сообщения. Это может не сработать!

...