访问数据库中平均静态数据的最佳方法(Hibernate,Postgres)

时间:2012-04-19 16:38:36

标签: database postgresql hibernate average

目前,我有一个项目(用Java编写),它从微控制器读取传感器输出,并使用Hibernate每秒将其写入几个Postgres表。总的来说,我每秒写入大约130列的数据。一旦数据被写入,它将永远保持静止。在当前条件下,该系统似乎表现良好。

我的问题是关于将来查询和平均这些数据的最佳方法。我认为有几种方法可行,但我正在寻找哪种方法可以扩展和表现最佳。

由于我们每秒收集和写入数据,最终每月产生超过250万行。我们当前通过写入JChart2D的JDBC select语句绘制此数据(即SELECT压力,温度,速度FROM数据WHERE time_stamp BETWEEN startTime AND endTime)。用户必须小心不要指定太长的时间段(startTimem和endTime delta <1天),否则他们将不得不等待几分钟(或更长时间)才能运行查询。

未来的目标是建立一个类似于支持Google财经的Google可视化API的用户界面。关于时间缩放,即数据变得“更平滑”(或更平均)的时间段越长。

我考虑过的选项如下:

选项A:使用SQL avg函数将平均数据点返回给用户。如果用户要求查看半年的数据,我认为这个选项会变得昂贵。我想这个场景中的接口会根据用户请求缩放平均行数。 I.E.如果用户要求一个月的数据,接口将请求每86400行的avg将返回~30个数据点,而如果用户要求一天的数据,接口将请求每2880行的avg,这也将返回30个数据点但更精细。

选项B:使用SQL返回时间间隔内的所有行,并使用Java界面平均数据。我已经简单地测试了这个用于踢,我知道它很昂贵,因为我要求返回86400行/天的间隔时间。我不认为这是一个可行的选择,除非在执行SQL select时我没有考虑到这一点。

选项C:由于所有这些数据在写入后都是静态的,因此我考虑使用Java程序(使用Hibernate)来编写平均值表以及它当前正在编写的数据。在这个选项中,我有几个java类“累积”数据然后平均它并以指定的间隔(5秒,30秒,1分钟,1小时,6小时等)将其写入表中。未来的用户界面绘图程序将采用用户指定的时间间隔并确定要查询的平均值表。这个选项似乎会创建大量的冗余并占用更多的存储空间,但(在我看来)会产生最佳性能?

选项D:来自更有经验的社区的建议?

1 个答案:

答案 0 :(得分:1)

一旦您有大量数据要传递,选项A将不会很好地扩展;与A相比,选项B可能倾向于开始相对较慢并且规模更差。选项C是一种通常称为“物化视图”的技术,您可能希望以这种或那种方式实现此方法以获得最佳性能和可伸缩性。虽然PostgreSQL还不支持声明性的物化视图(但我今年正在研究这个问题),但是有很多方法可以通过触发器和/或预定的工作来实现。

为了使插入保持快速,您可能想要尝试维护主表上触发器的任何视图。您可能想要做的是定期将详细信息汇总到crontab作业(或类似)的汇总表中。您可能还希望创建视图以使用已创建的汇总表显示汇总数据,并与不存在汇总表的明细表结合使用。

如果按日期范围分区您的原始数据,物化视图方法可能会更适合您。无论如何,这可能是一个非常好的主意。

http://www.postgresql.org/docs/current/static/ddl-partitioning.html