我有一个与SQL函数SUM()有关的理论问题。
假设我们有一个表,其中包含一个名为“值”的列
“值”是一个正数或负数的十进制数字。
在我们潜在的解决方案中,我们希望在所有行上为“值”列运行SUM()
SELECT SUM(value)
FROM table
到目前为止没有问题,但是数据集可能有数百万行。甚至可能保留数亿行,因为这些数据将在几年内保留下来。
所以我的问题是:
答案 0 :(得分:2)
您可以查看SQL Server
中的column store。简而言之,您可以在表上创建列存储索引-与传统的行存储索引不同。
这些索引是专门为在涉及大量数据(例如,在数据仓库star
和snowflake
方案中)时优化聚合查询而设计的。
来自docs:
列存储索引可以在以下方面实现高达100倍的更好性能 分析和数据仓库工作负载以及多达10倍的更好数据 比传统的行存储索引进行压缩。
因为:
SQL Server 2019
之前,只有涉及此类索引的查询才能受益于batch mode
处理,这将进一步减少您的执行时间(请查看此video以了解此模式)答案 1 :(得分:1)
您当然可以在整个表上运行SUM()
,而性能将大致取决于该表有多少条记录。请注意,在这种情况下,诸如索引之类的东西并不会真正提高性能,因为SQL Server必须触摸每条记录以计算总和。
如果在生产中的整个表上运行SUM
可能无法很好地扩展,那么要考虑的一种选择是将总和保持在单独的表中。然后,当记录被插入或删除时,您可以使用触发器适当地更新运行总计。这样,尽管由于触发逻辑会增加一些开销,但访问总和大约是恒定时间。
答案 2 :(得分:0)
我会提出一些想法。如果您正在使用的数据集绝对庞大,请考虑执行一项通宵工作以创建视图或某种临时表,并在早晨进入办公室时引用此聚合数据块。或者,将所有内容移动到云中(例如,Azure Databricks),然后在Spark中运行这些作业。 Spark运转很快,并且并行运行作业,因此一切都超快完成。祝你好运。