平均SQL Server中的大量数据

时间:2010-09-02 16:57:21

标签: sql sql-server-2005 average

期望对大量数据执行平均计算。数据是经常从设备中捕获的,我们希望得到最后一天的平均值,上周的平均值,上个月的平均值和去年的平均值。

不幸的是,拿去去年数据的平均值需要几分钟才能完成。我只掌握SQL的基本知识,并希望这里有一些好的信息可以加快速度。

该表有一个时间戳,一个ID,用于标识数据所属的设备以及浮点数据值。

我一直在使用的查询遵循以下一般示例:

 select avg(value)
 from table 
 where id in(1,2,3,4) timestamp > last_year

编辑:我还应该澄清他们要求这些平均数是在滚动的基础上计算的。与“年初至今”平均值一样。我确实意识到,仅仅由于结果的绝对数量,我们可能不得不妥协。

3 个答案:

答案 0 :(得分:1)

对于这类问题,您可以尝试以下解决方案: 1)优化查询:查看查询计划,创建一些索引,对现有索引进行碎片整理,在服务器空闲时运行查询等 2)创建缓存表。 要填充缓存表,请选择以下策略之一: 1)对影响结果的表使用触发器,并对插入,更新,删除刷新缓存表。触发器应该非常非常快速地运行。其他条件是不阻止任何记录(否则如果服务器忙,你将陷入死锁) 2)每天每小时/每小时填充一次作业缓存表 3)我喜欢的一个解决方案是在需要结果时(例如:当用户请求报告时)通过SP填充缓存并使用一些逻辑来序列化流程(一次只能生成一个用户)缓存)加上一些优化,以便下次不重新计算相同的行(例如:如果没有为昨天添加行,并且在缓存中我有昨天的结果,我不会重新计算该值 - 只计算来自的新值最后一次运行)

答案 1 :(得分:0)

你可以创建一个缓存表,对于统计缓存,它应该有类似于这个结构的东西:

year | reads_sum  | total_reads | avg
=====|============|=============|=====
2009 | 6817896234 | 564345      |

在年底,您使用现在快速计算的值来填充平均值(平均值)字段。

答案 2 :(得分:0)

您可能需要考虑在时间戳上创建Clustered索引。通常,聚集索引会浪费在id上。对此有一点警告,如果没有明确的排序,其他sql语句的输出的排序顺序可能会改变。