需要帮助来优化潜在错误的空间SQL查询

时间:2018-11-28 15:15:26

标签: sql sql-server spatial-query spatial-index

我是SQL的新手,我需要帮助来优化空间查询,以使其在2秒内运行。我们已经尝试了在各种站点上找到的一些建议(更多内容请参见下文)。

背景

我们有一个表[Id,Geometry],其中包含大约300,000种大小和复杂程度不同的几何形状,并存储为几何数据类型。我们使用下面的代码段为Geometry创建了空间索引。

CREATE SPATIAL INDEX [IX_Geometry_Spatial]
ON [dbo].[Geometries] ([Geometry]) USING  GEOMETRY_AUTO_GRID 
WITH  (
        BOUNDING_BOX = (XMAX = 24.43359375, XMIN = 10.810546875, YMAX = 69.2249968541159, YMIN = 55.2791152920156)
      );

我们想要的是找到与输入几何形状相交的所有几何形状。这是通过使用以下查询完成的。

DECLARE @g geometry;  
SET @g = geometry::STGeomFromText('POLYGON ((x0 y0, ...))', 4326); -- A Worst Case Polygon containing 1442 data points

SELECT Count(Id)
FROM Geometries
WHERE Geometries.Geometry.Filter(@g.Reduce(.25)) = 1

对于某些最坏情况下的输入几何形状(大而复杂的多边形),此执行大约需要7到10秒。

这是查询的执行计划: enter image description here

我们可以看到我们达到了空间索引,但是最昂贵的操作是clustered index seek (Clustered)

聚集索引查找详细信息:

enter image description here

空间索引查找详细信息:

enter image description here

问题

繁重的工作不是由空间索引完成,不是由聚集索引完成吗?

可以通过更改空间索引的设置来改善查询吗?我们应该使用哪些设置(用于GRIDS,CELLS_PER_OBJECT等)?

如何总体上缩短执行时间,或者对于这种查询您期望的执行时间是7-10秒?

我们尝试过的方法有帮助

每一个都节省了大约几秒钟。

  • 检查索引碎片并重建索引。
  • 将交集方法从STIntersect()切换到Filter()
  • 使用Reduce(.25)减少了输入几何。这样会将几何图形从1442个数据点减少到7个。(如果我们决定使用它,则对于不同的输入,它必须是动态的,但这是另一个问题。)
  • 引入了一个新的表格列SimpleGeometry,其中包含Geometry列中所有几何对象的边界框。创建了一个新的SimpleGeometry空间索引,并使用SimpleGeometry进行了查找,而不是Geometry。 (在查询示例中未使用。)

1 个答案:

答案 0 :(得分:0)

如果您每次添加一个新形状然后将交点仅存储在表格中进行计算,该怎么办?现在您的查询是即时的。