我必须通过 hibernate 执行一个包含超过 1000 个元素的选择,然后当我使用 Oracle 品牌时收到错误“ORA-01795:列表中的最大表达式数为 1000”。
SELECT * FROM matable WHERE column IN (?,?,...) (>1000 items)
我找到了很多解决方案:
用 OR 拆分列表
where A in (a,b,c,d,e,f)
becomes
where (A in (a,b,c) OR a in (d,e,f)) ...
使用 UNION ALL 创建一个表
SELECT * FROM maintable JOIN ( SELECT v1 a FROM DUAL UNION ALL SELECT v2 a FROM DUAL UNION ALL SELECT v3 a FROM DUAL UNION ALL ... SELECT v2000 a FROM DUAL) tmp on tmp.a = maintable.id
使用元组摆脱限制
where (column,0) in ((1,0),(2,0),(3,0),(4,0), ... ,(1500,0))
使用临时表..
where A in SELECT item FROM my_temporary_table
引用文献 here和 there还有 there .
我的问题如下:处理这个问题的最佳实践是什么?我所说的最佳实践是指性能最高的,但不仅限于 Oracle;如果我使用 hibernate ,我不想为每个品牌的数据库创建和管理不同的代码(我只关心 Oracle、MS SQL 和 PostGre)。
我的第一 react 是使用临时表,但我不知道什么影响最大。
最佳答案
使用临时表并使值成为表上的主键。这应该允许非常有效的优化来进行比较。最喜欢的是简单的索引查找,尽管如果表非常小,Oracle 可能会选择其他方法,例如表扫描。
这个方法应该比1000快or
条件,几乎在任何数据库中。有时 in
以类似的方式优化(使用二叉树来存储值)。在这样的数据库中,性能将是相似的。
关于sql - 处理 ORA-01795 :maximum number of expressions in a list is 1000 in hibernate 的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29096598/