跨大量行运行SUM

时间:2019-06-20 04:58:07

标签: mysql sql sql-server tsql sum

我有一个与SQL函数SUM()有关的理论问题。

假设我们有一个表,其中包含一个名为“值”的列

“值”是一个正数或负数的十进制数字。

在我们潜在的解决方案中,我们希望在所有行上为“值”列运行SUM()

SELECT SUM(value) 
FROM table

到目前为止没有问题,但是数据集可能有数百万行。甚至可能保留数亿行,因为这些数据将在几年内保留下来。

所以我的问题是:

  1. 您可以跨亿行运行SUM()吗?
  2. 在这么多行的查询中,我可以期望什么样的性能?我们还没有解决,但正在考虑使用MySQL或SQL Server。

3 个答案:

答案 0 :(得分:2)

您可以查看SQL Server中的column store。简而言之,您可以在表上创建列存储索引-与传统的行存储索引不同。

这些索引是专门为在涉及大量数据(例如,在数据仓库starsnowflake方案中)时优化聚合查询而设计的。

来自docs

  

列存储索引可以在以下方面实现高达100倍的更好性能   分析和数据仓库工作负载以及多达10倍的更好数据   比传统的行存储索引进行压缩。

因为:

  • 数据压缩-您可以从这里获得很多好处;例如,列存储索引从磁盘读取压缩数据,这意味着需要将较少字节的数据读入内存;
  • 消除列-列存储索引跳过了查询结果不需要的列的读取,并进一步减少了查询执行的I / O,因此提高了查询性能(与行存储索引不同)
  • 行组消除-使用元数据优化表扫描,以根据您的过滤条件消除特定的行组;
  • 批处理模式执行-在SQL Server 2019之前,只有涉及此类索引的查询才能受益于batch mode处理,这将进一步减少您的执行时间(请查看此video以了解此模式)

答案 1 :(得分:1)

您当然可以在整个表上运行SUM(),而性能将大致取决于该表有多少条记录。请注意,在这种情况下,诸如索引之类的东西并不会真正提高性能,因为SQL Server必须触摸每条记录以计算总和。

如果在生产中的整个表上运行SUM可能无法很好地扩展,那么要考虑的一种选择是将总和保持在单独的表中。然后,当记录被插入或删除时,您可以使用触发器适当地更新运行总计。这样,尽管由于触发逻辑会增加一些开销,但访问总和大约是恒定时间。

答案 2 :(得分:0)

我会提出一些想法。如果您正在使用的数据集绝对庞大,请考虑执行一项通宵工作以创建视图或某种临时表,并在早晨进入办公室时引用此聚合数据块。或者,将所有内容移动到云中(例如,Azure Databricks),然后在Spark中运行这些作业。 Spark运转很快,并且并行运行作业,因此一切都超快完成。祝你好运。