我是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秒。
我们可以看到我们达到了空间索引,但是最昂贵的操作是clustered index seek (Clustered)
聚集索引查找详细信息:
空间索引查找详细信息:
繁重的工作不是由空间索引完成,不是由聚集索引完成吗?
可以通过更改空间索引的设置来改善查询吗?我们应该使用哪些设置(用于GRIDS,CELLS_PER_OBJECT等)?
如何总体上缩短执行时间,或者对于这种查询您期望的执行时间是7-10秒?
每一个都节省了大约几秒钟。
STIntersect()
切换到Filter()
Reduce(.25)
减少了输入几何。这样会将几何图形从1442个数据点减少到7个。(如果我们决定使用它,则对于不同的输入,它必须是动态的,但这是另一个问题。)SimpleGeometry
,其中包含Geometry
列中所有几何对象的边界框。创建了一个新的SimpleGeometry
空间索引,并使用SimpleGeometry
进行了查找,而不是Geometry
。 (在查询示例中未使用。)答案 0 :(得分:0)
如果您每次添加一个新形状然后将交点仅存储在表格中进行计算,该怎么办?现在您的查询是即时的。