2012-04-19 59 views
1

目前我有一个项目(用Java编写),它从微控制器读取传感器输出,并使用Hibernate每秒将其写入多个Postgres表。总共我每秒钟写出大约130列的数据。一旦数据被写入,它将永远保持静态。这个系统在当前条件下似乎表现良好。访问数据库中平均静态数据的最佳方式(休眠,Postgres)

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

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

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

选项我已考虑:

选项A:使用SQL AVG函数的平均数据点返回给用户。如果用户要求查看半年的数据,我认为这个选项会变得昂贵。我想象这种情况下的界​​面会根据用户的请求将行数增加到平均水平。 I.E.如果用户要求一个月的数据,那么接口将请求每86400行的平均值,这将返回约30个数据点,而如果用户要求数据一天,接口将请求平均每2880行的平均值,这也将返回30个数据点,但粒度更细。

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

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

选项D:来自经验丰富的社区的建议?

+0

我不要求代码,我寻求建议或意见... – babcoccl 2012-04-19 17:26:13

+0

这显然不是编写代码的问题。这是一个使用哪些工具以及组织地将代码放在哪里的问题。 +1只是因为... – JayC 2012-04-19 17:56:04

+0

谢谢,根本没有寻找代码或甚至是深入的描述,只是从那些比我有更多经验的人那里寻找意见。我的意思是这样的事情一定是在对错之前完成的? – babcoccl 2012-04-19 18:21:23

回答

1

一旦您有大量数据需要传递,选项A不会趋向于很好地扩展;与A相比,期权B可能会开始相对较慢并且规模更差。选项C是一种通常称为“物化视图”的技术,您可能希望以这种或那种方式实现最佳性能和可伸缩性。虽然PostgreSQL还不支持声明性物化视图(但我个人今年正在处理这个视图),但有办法通过触发器和/或计划任务到达那里。

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

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

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

+0

感谢您的提示!现在我了解要研究什么。 – babcoccl 2012-04-20 13:11:56