首页 > 解决方案 > 从数百万条记录表中批量选择的最有效方法

问题描述

我有兴趣对表单查询返回的所有实体 A 进行一些处理:

 SELECT * FROM A a WHERE a.id not in (select b.id from B)

其中 A 是一个“复杂”实体,因为它从其他实体继承(InheritanceTyped.Joined)并且它的几个属性是其他实体(@OneToOne 和 @ManyToOne)。

查询本身需要几分钟才能产生结果,因此我希望尽可能少地执行它。

以下是我尝试尽可能有效地获取这些 A 元素的不同方法:

  1. 使用 setFirstResult/ setMaxResults 进行分页 完成这项工作,但速度很慢,因为查询似乎每次都执行。(大约 50 个元素处理/秒)
  2. 首先获取ID,然后是A对象 将所有ID保留在内存中是可行的,所以我执行一次

    SELECT a.id FROM A a WHERE a.id not in (select b.id from B)
    

然后 select a from A a WHERE a.id= :id,随着 id 列被索引,它的速度相对较快。这是目前最有效的解决方案(大约 100 个元素处理/秒)

  1. 使用 ScollableResults我对这个解决方案寄予厚望,但它最终比其他替代方案慢,让我每秒处理大约 20 个元素......

作为一个新手,我不知道还有什么其他的选择可以调查,或者我在任何尝试中是否做错了什么。

因此我的问题是:

  1. 是否有(事实上)其他有效解决此类问题的方法?
  2. ScrollableResults 表现如此糟糕是否正常?在实施此解决方案时我应该注意什么?

编辑: 这是执行计划 执行计划

标签: oraclehibernatejdbc

解决方案


推荐阅读