我有一个简单的表,包含2个表示X和Y坐标的浮点列。这两列中的每一列都有一个非聚集索引。在此表中,我想要使用这样的SQL将大约500万个数据点分组到自定义网格中:
SELECT COUNT(X) Count, AVG(X) CenterX, AVG(Y) CenterY
FROM DataPoints
GROUP BY FLOOR(X / 5), FLOOR(Y / 5)
在测试用例中,我将一个815000点的数据集拆分成一个网格,每个点都有自己的网格单元格。 SQL Server 2012 26000毫秒用于提供绝对过长的结果。我在一个简单的点阵列上使用LINQ进行了相同分组的C#实现,并且只用了 3450ms !我还为一些加速创建了SQL的存储过程,但是仍需要26-30秒来计算网格单元。
我无法理解为什么SQL Server需要很长时间来计算这些组。我知道所有815000个poitns可能需要很长时间来计算网格单元索引但是比简单的C#程序长7倍并不是一个真实的结果。
我还尝试使用空间类型来计算网格,但这些解决方案甚至更慢。使用几何列和空间索引(GEOMETRY_AUTO_GRID),内置sp_help_spatial_geometry_histogram
需要2:40分钟来计算包含数据的4个网格单元格。
有谁知道如何加速这么简单的SQL?将来,这些数据将被发送到浏览器中的地图,并且会有很多请求,因此< 100ms将是最终目标。
答案 0 :(得分:0)
执行计划告诉你什么? 为什么这么慢?
我建议你在x和y上放一个非聚集索引(不是单独的), 这个结果更好吗?