【问题标题】:Complicated reports for huge amount of data in oracleoracle中海量数据的复杂报表
【发布时间】:2013-03-15 13:43:30
【问题描述】:

我正在使用 oracle 11g 来存储大量数据(大约 1kk 条记录)。我的架构看起来像(简化):

客户表:

   ---------------------------------------
  |id | firstName | lastName | middleName |
   ---------------------------------------

手术台:

   ---------------------------------------
  |id | client_id | date | balance | type |
   ---------------------------------------

我需要为客户生成过滤和聚合的报告,包括不同的聚合行。例如,我需要一份报告,其中包含执行某种类型操作的客户。报告应包含以下列:所有操作的余额总和、过滤类型的操作余额总和、当年的操作余额总和。

我正在使用 java 和 hibernate 标准生成一个请求,但是代码会增长,现在维护起来太困难了。

使用 sql 生成复杂报告的最佳决策是什么:

  1. 将所有数据加载到我的应用程序中并将其聚合到我的代码中?
  2. 将过滤和聚合逻辑拆分为存储函数?
  3. 使用临时表分步拆分过滤和聚合?
  4. 使用 3rd 方软件或其他 nosql 存储来生成报告? (例如 bi 工具或 map-reduce)
  5. 写一个java存储过程?

什么是“标准企业”解决方案,可以生成具有正常性能和资源利用率的海量数据的复杂报告?

【问题讨论】:

  • 一般规则是:在 Oracle 中完成大部分工作,而不是在客户端软件上。巨大的 SQL 查询(1k+ 行)在 Oracle 世界中是正常的 :-) 但是如果您发现两个报告的共同部分,您应该分别计算它,并且可能将其结果保存在中间表中。

标签: java oracle hibernate reporting


【解决方案1】:

在这种情况下,Hibernate 不是你的朋友。第一步,尝试编写 Oracle 存储过程并通过 JDBC 或 Hibernate 从 Java 调用它们,如果您的应用程序的其余部分已经在使用 Hibernate。

如果您的计算有共同的部分,请考虑将它们分解为单独的存储过程。

如果有共同的数据变化比较慢(与其余数据相比),可以使用物化视图。

另一个考虑因素。如果您按日期进行大量报告,但操作表记录带有日期/时间字段的时间戳,请考虑为日历日期添加一个数字字段,格式为 20130315,并在其上编制索引。这将大大提高性能,但仍可能会给您留下大量的 Oracle 查询。

您的数据又有多大?什么是“1kk”?

【讨论】:

  • 拥有 1M 条记录,您肯定不会将它们全部加载到内存中并在 Java 中进行计算。对于 Oracle 而言,这没什么大不了的,但是当您每月获得 100 万条记录并且具有几年的数据保留要求时,您将不得不考虑 Oracle 表分区。届时,数字日历 ID 将再次派上用场。
猜你喜欢
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 2019-02-06
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
相关资源
最近更新 更多