我有一个简单的表,其中包含 2 个表示 X 和 Y 坐标的浮点列。非聚集索引位于这 2 列中的每一列上。在这个表中,我想使用这样的 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# 实现,只用了3450 毫秒!我还创建了一个 SQL 存储过程以加快速度,但计算网格单元仍需要 26-30 秒。
我不明白为什么 SQL Server 需要这么长时间来计算这些组。我知道在所有 815000 个点上计算网格单元索引可能需要很长时间,但比简单的 C# 程序长 7 倍不可能是一个现实的结果。
我还尝试使用空间类型来计算网格,但这些解决方案甚至更慢。使用几何列和空间索引 (GEOMETRY_AUTO_GRID),内置sp_help_spatial_geometry_histogram
需要 2:40 分钟来计算包含数据的 4 个网格单元。
有人知道如何加快这样一个简单的 SQL 的速度吗?将来,这些数据将被发送到浏览器中的地图,并且会有很多请求,因此 <100ms 将是最终目标。