我有一个表,其中包含面数据的几何列沿着位置。我正在尝试执行查询以查找点所在的面。我一直在使用的当前查询有效,但返回结果需要50秒。有什么方法可以减少执行时间吗?
declare @point geometry = geometry::Point(ISNULL(-77.6914,0),ISNULL(38.6140,0), 32768)
select @point
SELECT hucname
FROM polygonlocations a
Where 1=1 AND a.ogr_geometry.MakeValid().STContains(@point) = 1
我也尝试过为geometry列ogr_geometry添加空间索引,但加载后需要52秒。我尝试了下面的查询来创建索引:
CREATE SPATIAL INDEX [idxGeometryIndex] ON polygonlocations
( ogr_geometry )USING GEOMETRY_GRID
WITH (
BOUNDING_BOX =(-180, -90, 180, 90))
GO
1条答案
按热度按时间ruarlubt1#
首先,看起来你对实际上是地理对象使用了
geometry
数据类型。它们之间的主要区别是geometry
将其所有对象“放置”在一个平面上,而geography
将它们放置在一个近似地球形状的大地水准面上。第二,索引不能处理您的查询,因为您调用了
MakeValid()
方法,该方法可能返回一个不同的多边形,而该多边形不在索引中。我建议在将数据放入数据库时对其进行清理。清理除了MakeValid()
之外,还应该包含一个可选的ReorientObject()
调用,用于处理有环方向问题的多边形。你可以这样做:最后但并非最不重要的是,在我的实验中,我发现
geography_auto_grid
在某种程度上优于旧的geography_grid
选项。这是我在系统中为多边形创建的空间索引的一个示例:cells_per_object
的最佳值在您的环境中可能会有所不同(而且它也可能因表而异,具体取决于您在每个表中存储的多边形的性质和大小)。我建议您尝试几个不同的值,看看哪个值在您的特定情况下效果最好。