【问题标题】:Hibernate is not using indexHibernate 没有使用索引
【发布时间】:2015-04-19 22:39:44
【问题描述】:

我一直在对我拥有的应用程序进行性能调整。 它基于 Spring,使用休眠 4.2.19.Final。数据库是 DB2

在数据库中有一个表 CUSTOMER,上面有很多字段。 其中 2 个是 status 和 surname,这 2 个列包含在一个索引中。

Hibernate/Spring 数据存储库生成以下语句并且它使用索引:

 select * from CUSTOMER where status=? and surname=?

如果我从任何数据库客户端工具执行以下操作,它将使用索引

 select * from CUSTOMER where status='LIVE' and surname='BLAAAA'

主要区别在于,在底层,hibernate 似乎使用带有绑定参数的 PreparedStatement。 IE。 (ps.setString(2, Constants.STATUS.SUSPENDED.name());)

我正在使用 db2explain、db2top、IBM 数据工作室来验证索引没有被休眠使用。

有人知道解决这个问题的方法吗? 或者我是否必须在这个场景中避免休眠/弹簧数据,并进行自定义查询?

【问题讨论】:

  • 我不认为 Hibernate 是这里的问题。 DB2 将决定何时使用和索引或不使用和索引这是数据库服务器的功能,而不是 JPA 的功能。

标签: hibernate jdbc db2 spring-data-jpa


【解决方案1】:

是否使用索引可能是由 DB2 做出的,而不是 Hibernate。我对它为什么不使用索引的最佳猜测是因为列 status 的基数较低。在这种情况下,DB2 可能认为表扫描实际上可能更快。

http://www.ibm.com/developerworks/data/library/techarticle/dm-1309cardinal/

【讨论】:

    【解决方案2】:

    Hibernate 确实不会“干扰”索引。当框架执行查询时,它将从提供的映射和映射中自动生成 SQL,然后将其直接发送到数据库并在那里,RDMS 将确定执行它的“最佳方式”是什么。

    【讨论】:

      【解决方案3】:

      正如其他人已经提到的:休眠不决定使用或不使用索引。您的数据库可以。

      数据库面临的挑战是:它可以判断索引对 status='LIVE' 和 surname='BLAAAA' 有帮助,但它认为对于任意值索引没有帮助,它通常决定执行计划在绑定参数之前。

      DB2 似乎提供了一种方法来强制它在绑定参数后重新创建执行计划。 它实际上似乎有两种变体。

      要么对所有语句强制使用它,要么只对某些语句指定它。 Both variants are described in this detailed article.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-02
        • 1970-01-01
        • 2013-11-15
        • 2023-03-06
        相关资源
        最近更新 更多