Oracle 知道where a in (..)
子句中 1000 个元素的限制。将 Hibernate 与 Oracle 结合使用时是否也存在此限制?
问问题
8973 次
4 回答
4
这个数据库限制在休眠中仍然存在。如果您确实需要在 in 子句中包含 1000 多个项目,则您必须自己在代码中拆分列表并为每个 1000 个键块运行查询,然后将结果集附加在一起。
请注意,如果您的查询需要对查询结果进行排序或以其他方式聚合,则此 hack 将失效,因为只有在代码中才能知道完整的结果集。在这种情况下,您最好找到另一种编写不需要IN
子句的查询的方法。
于 2009-11-04T16:00:31.787 回答
3
我们遇到了同样的问题,并通过将其拆分为 IN 子句的 100er 包来解决它
select * from mytable where id in (...) or id in (...).
评论:
- 确保使用绑定变量
- 确保查询看起来总是一样的。这是通过用 -1 填充 IN 子句来完成的,直到其中有 100 个元素
- 尝试始终使用相同数量的 ORed in(...) 以便查询始终看起来相同
为什么要以上几点?这样查询优化器就可以重用查询计划。
附加优化:
- 而不是使用-1,您可以再次使用最后一个真值。这甚至更好一点。
示例:in(1, 2, 3, 4, 4, ..., 4)
另请注意:我们在 in 子句中使用各种固定数量的元素进行了测试,并观察到超过 100 个元素的性能下降。
于 2012-01-04T20:30:41.390 回答
2
是的,因为 Hibernate 会在某个阶段调用 Oracle,因此限制是 Hibernate 和 Oracle 限制中的最低值
Hibernate 对 in 的数据没有什么特别的 - 只是将它传递给数据库
于 2009-11-04T12:38:14.370 回答
1
这似乎是Hibernate中的一个Bug:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1123
于 2010-01-27T05:27:21.780 回答