【发布时间】:2010-12-13 00:16:05
【问题描述】:
Oracle 知道 where a in (..) 子句中的 1000 个元素的限制。将 Hibernate 与 Oracle 结合使用时是否也存在此限制?
【问题讨论】:
Oracle 知道 where a in (..) 子句中的 1000 个元素的限制。将 Hibernate 与 Oracle 结合使用时是否也存在此限制?
【问题讨论】:
我们遇到了同样的问题,并通过将其拆分为 100 多个 IN 子句包来解决它
select * from mytable where id in (...) or id in (...).
备注:
你为什么要以上几点?这样查询优化器就可以重用查询计划。
额外优化:
示例:in(1, 2, 3, 4, 4, ..., 4)
另请注意:我们在 in 子句中使用各种固定数量的元素进行了测试,发现超过 100 个元素的性能下降。
【讨论】:
这似乎是Hibernate中的一个Bug:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1123
【讨论】:
hibernate 仍然存在此数据库限制。如果您确实需要在 in 子句中包含 1000 多个项目,则您必须自己在代码中拆分列表并为每个 1000 个键块运行查询,然后将结果集附加在一起。
请注意,如果您的查询需要对查询结果进行排序或以其他方式聚合,则此 hack 会失效,因为只有在代码中才能知道完整的结果集。在这种情况下,您最好找到另一种编写不需要IN 子句的查询的方法。
【讨论】:
是的,因为 Hibernate 会在某个阶段调用 Oracle,因此限制是 Hibernate 和 Oracle 限制中的最低值
Hibernate 对 in 的数据没有什么特别的作用 - 只是将它传递给数据库
【讨论】: