从数百万个记录表中批量选择的最有效方法

时间:2019-02-19 07:43:11

标签: oracle hibernate jdbc

我有兴趣对以下形式的查询返回的所有实体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表现不佳是正常现象吗?实施此解决方案时我应该注意什么?

编辑: 这是执行计划 execution plan

0 个答案:

没有答案
相关问题