【问题标题】:Grouping of Million Data Points slow百万数据点分组缓慢
【发布时间】:2013-07-11 20:23:37
【问题描述】:

我有一个简单的表格,其中包含代表 X 和 Y 坐标的 2 个浮点列。非聚集索引位于这 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# 实现,并且只用了 3450ms!我还创建了一个 SQL 存储过程以加快速度,但计算网格单元仍需要 26-30 秒。

我不明白为什么 SQL Server 需要这么长时间来计算这些组。我知道在所有 815000 个点上计算网格单元索引可能需要很长时间,但比简单的 C# 程序长 7 倍不可能是一个现实的结果。

我也尝试使用空间类型来计算网格,但这些解决方案甚至更慢。使用几何列和空间索引 (GEOMETRY_AUTO_GRID) 内置 sp_help_spatial_geometry_histogram 需要 2:40 分钟来计算包含数据的 4 个网格单元。

有人知道如何加速这样一个简单的 SQL 吗?将来,这些数据将被发送到浏览器中的地图,并且会有很多请求,因此

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:

    执行计划告诉你什么? 为什么这么慢?

    我建议你在 x 和 y 上放置一个非聚集索引(不是分开的), 这个结果更好吗?

    【讨论】:

    • 这是执行计划:oi43.tinypic.com/2ufu79j.jpg 繁重的操作当然是分组和平均计算。我还添加了两列索引,但查询仍然需要很长时间才能完成。我假设可能不是服务器,而是需要很长时间才能将所有数据行发送到客户端。在启用客户端统计后,我发现第一个响应已经在 3600ms 之后发送,这与我的 C# 代码基本相同。我是否可以做另一项性能改进,以更快地完成这项任务?
    • 我想玩弄你的数据,看看是否可行,你能把表定义和它得到的总行数发给我吗,我将重新创建数据以供进一步研究!
    • 数据是随机生成的。您可以在这里下载:docs.google.com/file/d/0BxHJCurpGhQ4YXdGVC1SamhjWjg/… 该表有 2 个简单的浮点列:gist.github.com/Danielku15/a2698a028feffd040ed8
    • 我完全忘记了这一点,我已经在我的 localdb 实例中导入了数据,在普通桌面磁盘上运行,我得到总执行时间:平均 396,你在什么 sql server 上测试这个?
    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 2011-08-11
    • 1970-01-01
    • 2015-03-03
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多