Java oracle中海量数据的复杂报表

Java oracle中海量数据的复杂报表,java,oracle,hibernate,reporting,Java,Oracle,Hibernate,Reporting,我使用Oracle11g来存储大量数据(大约1kk的记录)。我的模式如下(简化): 客户表: --------------------------------------- |id | firstName | lastName | middleName | --------------------------------------- 手术台: --------------------------------------- |id | client_id | date

我使用Oracle11g来存储大量数据(大约1kk的记录)。我的模式如下(简化):

客户表:

   ---------------------------------------
  |id | firstName | lastName | middleName |
   ---------------------------------------
手术台:

   ---------------------------------------
  |id | client_id | date | balance | type |
   ---------------------------------------
我需要为客户端生成过滤和非过滤报告,包括不同的非过滤行。例如,我需要一个报告,其中包含具有某种类型操作的客户端。报表应包含以下列:所有业务的余额之和、过滤类型的业务余额之和、本年度的业务余额之和

我正在使用java和hibernate标准生成一个请求,但是代码在增长,现在很难维护它

使用sql生成复杂报表的最佳决策是:

  • 将所有数据加载到我的应用程序并在我的代码中放弃它
  • 将滤波和去负逻辑拆分为存储函数
  • 使用临时表分步骤拆分过滤和还原
  • 是否使用第三方软件或其他nosql存储来生成报告?(如bi工具或map reduce)
  • 编写java存储过程

  • 什么是“standart enterprise”解决方案,能够以正常的性能和资源利用率生成关于大量数据的复杂报告?

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

    如果计算有共同的部分,考虑把它们分解成单独的存储过程。< /P> 如果存在更改相对较慢的公共数据(与其他数据相比),则可以使用物化视图

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


    你的数据又有多大?什么是“1kk”?在这种情况下,Hibernate不是你的朋友。作为第一步,如果应用程序的其余部分已经在使用Hibernate,请尝试编写Oracle存储过程并通过JDBC或Hibernate从Java调用它们

    如果计算有共同的部分,考虑把它们分解成单独的存储过程。< /P> 如果存在更改相对较慢的公共数据(与其他数据相比),则可以使用物化视图

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


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

    常见规则是:在Oracle中完成大部分工作,而不是在客户端软件上。巨大的SQL查询(1k+行)在Oracle world中是正常的:-),但如果您发现两个报表的公共部分,则应分别计算,并可能将其结果保存在中间表中。常见规则是:在Oracle中完成大部分工作,而不是在客户端软件上。巨大的SQL查询(1k+行)在Oracle world中是正常的:-),但如果您找到两个报表的公共部分,则应该分别计算,并可能将其结果保存在中间表中。对于1M记录,您肯定不知道如何将它们全部加载到内存中,并使用Java进行计算。对于Oracle来说,没有什么大不了的,但是如果你每月获得1M记录,比如说数据保存需求,比如说,几年,你就必须考虑Oracle表分区。数字日历id在那个时候会再次派上用场。对于1M记录,您肯定不知道如何将它们全部加载到内存中并用Java进行计算。对于Oracle来说,没有什么大不了的,但是如果你每月获得1M记录,比如说数据保存需求,比如说,几年,你就必须考虑Oracle表分区。此时数字日历id将再次派上用场。