sql - 处理 ORA-01795 :maximum number of expressions in a list is 1000 in hibernate 的最有效方法

标签 sql oracle hibernate

我必须通过 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


引用文献 herethere还有 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/

相关文章:

SQL 计数器困难

java - hibernate 恩弗斯 : Better way to add multiple Projections

java - 验证不适用于 Spring Boot 和 Hibernate

oracle - 如何删除所有用户表?

java - hibernate 列的最大长度

mysql - 获得最畅销的产品

java - 查看一个表中出现在另一表中的值

sql - 避免约会冲突 Access

oracle - 负载均衡数据库连接池

sql - 通过比较两个不同的数据库获取最大 ID