我有一个简单的表,其中包含2个浮点列表示X和Y坐标。这两列中的每一列都有一个非聚集索引。在该表中大约有500万个数据点,我要归入定制网使用这样的SQL:百万数据点分组缓慢
SELECT COUNT(X) Count, AVG(X) CenterX, AVG(Y) CenterY
FROM DataPoints
GROUP BY FLOOR(X/5), FLOOR(Y/5)
在测试情况下,我分裂数据设定815000点成网格,每个点得到他自己的网格单元格。 SQL服务器2012 26000毫秒提供的结果明确地太长。我在一个简单的点数组上使用LINQ进行了相同分组的C#实现,并且它只用了3450ms!我还创建了SQL的存储过程以提高速度,但仍需要26-30秒来计算网格单元格。
我不明白为什么需要在SQL Server上长calcualte这些群体。我知道在所有815000个poit中计算网格单元索引可能需要很长时间,但是比简单的C#程序长7倍不是一个现实的结果。
我还试图用空间类型做计算网格,但这些解决方案是更慢。使用几何列和空间索引(GEOMETRY_AUTO_GRID),内置的sp_help_spatial_geometry_histogram
需要2:40min来计算4个包含数据的网格单元。
有任何人的想法如何加快这样一个简单的SQL?将来这些数据将被发送到浏览器中的地图,并且会有很多请求,所以100ms将是一个终极目标。
这是执行计划:http://oi43.tinypic.com/2ufu79j.jpg重操作过程分组和平均计算的。我还添加了两列索引,但查询仍需要很长时间才能完成。我假设可能不是服务器,但是需要很长时间才能将所有数据行发送到客户端。在启用客户端统计信息后,我发现第一个响应已经在3600ms之后发送,这与我的C#代码基本相同。为了更快地完成这项任务,我可以做另一项性能改进吗? – Danielku15
我想玩弄你的数据,看看它是否可能,你可以发送表格定义,以及它得到的行数,我将重新创建数据以供进一步研究! – bonitzenator
数据是随机生成的。你可以在这里下载:https://docs.google.com/file/d/0BxHJCurpGhQ4YXdGVC1SamhjWjg/edit?usp=sharing该表有2个简单的浮动列:https://gist.github.com/Danielku15/a2698a028feffd040ed8 – Danielku15