1

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

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

该表有一个时间戳、一个标识数据属于哪个设备的 ID 和一个浮点数据值。

我一直在使用的查询遵循这个一般示例:

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

编辑:我还应该澄清他们要求滚动计算这些平均值。如“年初至今”的平均值。我确实意识到,仅仅由于结果数量庞大,我们可能不得不妥协。

4

3 回答 3

1

对于此类问题,您始终可以尝试以下解决方案:1)优化查询:查看查询计划,创建一些索引,对现有索引进行碎片整理,在服务器空闲时运行查询等 2)创建缓存表. 要填充缓存表,请选择以下策略之一:1)在影响结果的表上使用触发器,并在插入、更新、删除时刷新缓存表。触发器应该运行得非常、非常、非常快。其他条件是不阻止任何记录(否则,如果服务器很忙,您最终会陷入死锁)2)每天/每小时/等一次用作业填充缓存表 3)我喜欢的一个解决方案是填充需要结果时由 SP 缓存(例如:

于 2010-09-02T17:53:14.243 回答
0

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

于 2010-09-02T18:02:37.923 回答
0

您可以制作一个缓存表,用于统计缓存,它应该具有类似于此结构的内容:

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

在年底,您用现在可以快速计算的值填写 avg(平均值)字段。

于 2010-09-02T17:10:38.260 回答