【问题标题】:oracle where in limitation to 1000 / hibernateoracle 限制为 1000 / 休眠
【发布时间】:2010-12-13 00:16:05
【问题描述】:

Oracle 知道 where a in (..) 子句中的 1000 个元素的限制。将 Hibernate 与 Oracle 结合使用时是否也存在此限制?

【问题讨论】:

    标签: oracle hibernate where


    【解决方案1】:

    我们遇到了同样的问题,并通过将其拆分为 100 多个 IN 子句包来解决它

    select * from mytable where id in (...) or id in (...).
    

    备注:

    • 确保使用绑定变量
    • 确保查询看起来总是一样的。这是通过用 -1 填充 IN 子句来完成的,直到其中有 100 个元素
    • 尝试始终使用相同数量的 ORed in(...),以便查询始终看起来相同

    你为什么要以上几点?这样查询优化器就可以重用查询计划。

    额外优化:

    • 您可以再次使用最后一个真值,而不是使用 -1。这样就更好了。

    示例:in(1, 2, 3, 4, 4, ..., 4)

    另请注意:我们在 in 子句中使用各种固定数量的元素进行了测试,发现超过 100 个元素的性能下降。

    【讨论】:

    • PS:如果在 IN 子句中返回值的 sql 语句是已知的,您可能还需要考虑将您的 IN 替换为 EXISTS 语句。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      hibernate 仍然存在此数据库限制。如果您确实需要在 in 子句中包含 1000 多个项目,则您必须自己在代码中拆分列表并为每个 1000 个键块运行查询,然后将结果集附加在一起。

      请注意,如果您的查询需要对查询结果进行排序或以其他方式聚合,则此 hack 会失效,因为只有在代码中才能知道完整的结果集。在这种情况下,您最好找到另一种编写不需要IN 子句的查询的方法。

      【讨论】:

      • 另一种方法是将 1000 多个值粘贴到数据库中的全局临时表中,然后连接这两个表。数据库非常擅长连接表:)
      • 完全由数据库来完成工作!拆分是一种众所周知的解决方法,但它应该表明您需要重新考虑您的方法。
      • 另一种选择是对 1000 个元素 IN 组执行 OR。这样您就可以在查询时“订购”。
      【解决方案4】:

      是的,因为 Hibernate 会在某个阶段调用 Oracle,因此限制是 Hibernate 和 Oracle 限制中的最低值

      Hibernate 对 in 的数据没有什么特别的作用 - 只是将它传递给数据库

      【讨论】:

        猜你喜欢
        • 2012-10-30
        • 1970-01-01
        • 2013-03-14
        • 2014-11-10
        • 1970-01-01
        • 2011-05-05
        • 2011-07-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多