我有两个带有Geometry数据类型的MS SQL Server(v11.0)表。一个有~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是不是很擅长计算数据集的几何内容?我看到的大多数代码示例都涉及一个几何类型变量,其中一个值被操作。
这完全是一个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权限以停止查看它最多找到一个包含该点的多边形。
注意:我将此作为答案而不是评论发布的唯一原因是格式和帖子的长度。这可能行不通!