1

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

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

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

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

我考虑过的选项如下:

选项 A:使用 SQL avg 函数将平均数据点返回给用户。如果用户要求查看半年的数据,我认为这个选项会变得昂贵。我想这个场景中的界面会根据用户请求将行数缩放到平均水平。IE 如果用户要求一个月的数据,界面将要求每 86400 行的平均值,这将返回约 30 个数据点,而如果用户要求一天的数据,界面将要求每 2880 行的平均值,这也将返回 30 个数据点,但粒度更大。

选项 B:使用 SQL 返回某个时间间隔内的所有行,并使用 Java 接口对数据进行平均。我已经对此进行了简短的测试,并且我知道它很昂贵,因为我要返回 86400 行/天请求的间隔时间。我不认为这是一个可行的选择,除非在执行 SQL 选择时我没有考虑到某些事情。

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

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

4

1 回答 1

1

一旦您有大量数据要传递,选项 A 就不会很好地扩展;与 A 相比,选项 B 的启动速度可能相对较慢,而且扩展性更差。选项 C 是一种通常称为“物化视图”的技术,您可能希望以一种或另一种方式实现这种技术,以获得最佳性能和可伸缩性。虽然 PostgreSQL 还不支持声明性物化视图(但我个人今年正在努力),但有一些方法可以通过触发器和/或计划作业来实现。

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

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

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

于 2012-04-19T22:01:33.220 回答