oracle - 从数百万条记录表中批量选择的最有效方法
问题描述
我有兴趣对表单查询返回的所有实体 A 进行一些处理:
SELECT * FROM A a WHERE a.id not in (select b.id from B)
其中 A 是一个“复杂”实体,因为它从其他实体继承(InheritanceTyped.Joined)并且它的几个属性是其他实体(@OneToOne 和 @ManyToOne)。
查询本身需要几分钟才能产生结果,因此我希望尽可能少地执行它。
以下是我尝试尽可能有效地获取这些 A 元素的不同方法:
- 使用 setFirstResult/ setMaxResults 进行分页 完成这项工作,但速度很慢,因为查询似乎每次都执行。(大约 50 个元素处理/秒)
首先获取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 个元素处理/秒)
- 使用 ScollableResults我对这个解决方案寄予厚望,但它最终比其他替代方案慢,让我每秒处理大约 20 个元素......
作为一个新手,我不知道还有什么其他的选择可以调查,或者我在任何尝试中是否做错了什么。
因此我的问题是:
- 是否有(事实上)其他有效解决此类问题的方法?
- ScrollableResults 表现如此糟糕是否正常?在实施此解决方案时我应该注意什么?
解决方案
推荐阅读
- outlook - 如何从 Outlook 加载项插入 Outlook 可操作消息
- powershell - 从云下载的 exe 文件未从 cmd 运行
- python - 等元素指数
- data-structures - 由于虚拟节点,红黑树是否被视为完整二叉树?
- javascript - 使用没有正则表达式的循环匹配字符串上的模式
- python - 在 Jinja 中记录宏是否有官方格式?
- android - 如何理解对 mvvm 的依赖?
- neo4j - Cypher 查询与多个匹配块的行为不符?
- c++ - 如何在 Crypto++ 中使用 RSA OAEP SHA-256 加密/解密数据
- r - R regex 正则表达式:从字符串中的逗号分隔值创建字符列表