【问题标题】:Best way to access averaged static data in a Database (Hibernate, Postgres)访问数据库中平均静态数据的最佳方式(Hibernate、Postgres)
【发布时间】:2012-04-19 16:38:35
【问题描述】:

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

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

由于我们每秒收集和写入数据,我们最终每月生成超过 250 万行数据。我们目前通过写入 JChart2D 的 JDBC 选择语句绘制这些数据(即从数据 WHERE time_stamp BETWEEN 和 endTime 中选择压力、温度、速度)。用户必须注意不要指定太长的时间段(startTimem 和 endTime delta

未来的目标是拥有一个类似于为 Google 财经提供支持的 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:来自更有经验的社区的建议?

【问题讨论】:

  • 我不是要代码,我是在征求建议或意见...
  • 这显然不是写代码的问题。这是一个使用什么工具以及在哪里组织地放置代码的问题。 +1 只是因为...
  • 谢谢,根本不找代码,甚至没有深入的描述,只是寻找比我更有经验的人的意见。我的意思是这样的事情必须在正确之前完成?

标签: database postgresql hibernate average


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的提示!现在我知道要研究什么了。
猜你喜欢
  • 2011-08-19
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2011-02-24
  • 2014-02-25
  • 2021-05-14
相关资源
最近更新 更多