当前位置: 首页 > 面试题库 >

处理巨大数据表时应如何使用Hibernate Mapping

齐雅畅
2023-03-14
问题内容

问题定义:
我有一个包含大量数据(超过100,000行)的数据库表,表结构像

AppID  DocID  DocStatus 
1      100    0
1      101    1    
2      200    0    
2      300    1

每个applicationID可能有成千上万的文档,我必须获取按applicationID分组的状态为0的文档数和状态为1的文档数。

当我使用hibernate方式映射该对象时,由于大量的表数据,它将占用大量的堆内存。

如何使用Hibernate查询实现这一目标? 还是我应该为此使用SQL查询或存储过程?

注意: 我的Web应用程序在JAVA / Tapestry框架中并使用Hibernate3。数据库是SQL Server 2012。


问题答案:

每当遇到以数据为中心的问题(与以Java域模型为中心的问题相对)时,都应直接使用SQL。您的数据库将比Java代码快得多,因为可以对数据进行紧密的计算,而不必通过导线将其全部传输到内存中。另请参阅本博客文章“
2.处理内存中的数据”

您可以直接使用JDBC,本地查询或您选择的任何第三方SQL库(例如MyBatis或jOOQ)来实现。

您可以使用以下任一查询轻松解决您的问题:

使用GROUP BY

SELECT [AppID], [DocStatus], count(*)
FROM [MyTable]
GROUP BY [AppID], [DocStatus]

SQLFiddle上的示例

使用嵌套选择

SELECT [AppID],
       (SELECT count(*) FROM [MyTable] [t2]
        WHERE [t1].[AppID] = [t2].[AppID]
        AND [DocStatus] = 0) [Status_0],
       (SELECT count(*) FROM [MyTable] [t2]
        WHERE [t1].[AppID] = [t2].[AppID]
        AND [DocStatus] = 1) [Status_1]
FROM [MyTable] [t1]
GROUP BY [AppID]

SQLFiddle上的示例

使用SUM()

SELECT [AppID],
       SUM(IIF([DocStatus] = 0, 1, 0)) [Status_0],
       SUM(IIF([DocStatus] = 1, 1, 0)) [Status_1]
FROM [MyTable] [t1]
GROUP BY [AppID]

SQLFiddle上的示例

使用PIVOT

SELECT [AppID], [0], [1]
FROM (
  SELECT [AppID], [DocStatus]
  FROM [MyTable]
) [t]
PIVOT (count([DocStatus]) FOR [DocStatus] IN ([0], [1])) [pvt]

SQLFiddle上的示例



 类似资料:
  • 问题内容: 我正在寻找一种数学解决方案,该解决方案可以处理真实(长,大,大,风暴)数字。我还没有发现任何东西,但是我不想现在这个问题还没有解决。我正在寻找一种简单的Number解决方案,例如MicrosoftExcelPrecision(30位十进制)或BigInteger(Java)解决方案。当然是用Java语言编写的。 问题答案: BigInt现在是Firefox和Chrome的一部分; 你不

  • 我正在尝试用H2O(3.14)训练机器学习模型。我的数据集大小是4Gb,我的计算机RAM是2Gb,带有2G交换,JDK 1.8。参考本文,H2O可以使用2Gb RAM处理大型数据集。 关于大数据和GC的说明:当Java堆太满时,我们会进行用户模式的磁盘交换,即,您使用的大数据比物理DRAM多。我们不会因GC死亡螺旋而死亡,但我们会降级到核心外的速度。我们将以磁盘允许的速度运行。我个人测试过将12G

  • 有时我使用filter,如您所见,有时如果需要,我使用distinct/sort。但是我仍然有很多运行时错误。 我会很乐意提供一些如何处理它的技巧。 @cricket_007 我的代码: 所以基本上,当我试图用嵌套循环解决这个任务时,我得到了O(n^2)的算法复杂度。如何解决?

  • 问题内容: 我在cron作业中使用mysqldump备份了超过200万行的数据库。 它会创建一个文本文件,该文件可用于从命令行还原数据日志。 我认为在还原之前编辑转储将是有用的,这是一种 快速 更改值和表或列名的方法-至少要等到我了解更多并对使用ALTER和UPDATE做到这一点充满信心为止。 编辑大型文本文件不会打扰我,但是我惊讶地发现,在数据库的 250兆字节 转储中, 只有大约300行 。每

  • 问题内容: 我有相对较小的对象的巨大(〜7GB)json数组。 有没有一种相对简单的方法可以过滤这些对象而无需将整个文件加载到内存中? --stream 选项看起来合适,但我不知道如何将[path,value]的流折叠到原始对象。 问题答案: jq 1.5具有流解析器。jq FAQ提供了一个示例,该示例如何将JSON对象的顶级数组转换为其元素流: 这可能足以满足您的目的,但是值得注意的是setpa

  • 问题内容: 我用来并行化一些繁重的计算。 目标函数返回大量数据(庞大的列表)。我的RAM用完了。 如果不使用,我只需将生成的元素依次计算出来,就将目标函数更改为生成器。 我了解多处理不支持生成器- 它等待整个输出并立即返回,对吗?没有屈服。有没有一种方法可以使工作人员在数据可用时立即产生数据,而无需在RAM中构造整个结果数组? 简单的例子: 这是Python 2.7。 问题答案: 这听起来像是队列