SQL Server 空间查询执行时间过长

bq9c1y66  于 2022-11-21  发布在  其他
关注(0)|答案(1)|浏览(159)

我有一个表,其中包含面数据的几何列沿着位置。我正在尝试执行查询以查找点所在的面。我一直在使用的当前查询有效,但返回结果需要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
ruarlubt

ruarlubt1#

首先,看起来你对实际上是地理对象使用了geometry数据类型。它们之间的主要区别是geometry将其所有对象“放置”在一个平面上,而geography将它们放置在一个近似地球形状的大地水准面上。
第二,索引不能处理您的查询,因为您调用了MakeValid()方法,该方法可能返回一个不同的多边形,而该多边形不在索引中。我建议在将数据放入数据库时对其进行清理。清理除了MakeValid()之外,还应该包含一个可选的ReorientObject()调用,用于处理有环方向问题的多边形。你可以这样做:

update t set
  t.GeoData = t.GeoData.ReorientObject()
from YourTable t
where t.GeoData.EnvelopeAngle() > 179;

最后但并非最不重要的是,在我的实验中,我发现geography_auto_grid在某种程度上优于旧的geography_grid选项。这是我在系统中为多边形创建的空间索引的一个示例:

create spatial index [IX_AreaUnits_GeoData] on dbo.AreaUnits (GeoData)
with (
  cells_per_object = 256
);
go

cells_per_object的最佳值在您的环境中可能会有所不同(而且它也可能因表而异,具体取决于您在每个表中存储的多边形的性质和大小)。我建议您尝试几个不同的值,看看哪个值在您的特定情况下效果最好。

相关问题