Java Spring数据JPA-带时间戳的慢速DB2查询

Java Spring数据JPA-带时间戳的慢速DB2查询,java,hibernate,spring-boot,db2,spring-data-jpa,Java,Hibernate,Spring Boot,Db2,Spring Data Jpa,对于在特定时间段内加载数据的查询,我有一个巨大的性能问题。这是包含查询的my JpaRepository: public interface MyTableRepository extends JpaRepository<MyTable, Integer> { @Query("SELECT t FROM MyTable t WHERE t.dateTime BETWEEN :start AND :end") List<MyTable> findByDat

对于在特定时间段内加载数据的查询,我有一个巨大的性能问题。这是包含查询的my JpaRepository:

public interface MyTableRepository extends JpaRepository<MyTable, Integer> {

    @Query("SELECT t FROM MyTable t WHERE t.dateTime BETWEEN :start AND :end")
    List<MyTable> findByDateTimeRange(
            @Param("start") Instant start,
            @Param("end") Instant end
    );

}
我这样称呼它:

myTableRepository.findByDateTimeRange(
        Instant.parse("2016-02-17T12:00:00Z"), Instant.parse("2016-02-17T13:00:00Z"));
它生成预期的查询和预期结果中的结果,但完成大约需要2分钟,这是不可接受的。如果我在where条件下直接在DB2中使用
在'2016-02-17 12:00:00'和'2016-02-17 13:00:00'之间执行相同的查询
,则只需大约150ms即可完成相同的结果

我预计在将实例映射到已执行查询中的时间戳时会出现一些问题,但在启用Hibernate日志记录时,所有这些似乎都是正确的:

2016-02-18 14:05:52.696 TRACE 12796 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [TIMESTAMP] - [Wed Feb 17 13:00:00 CET 2016]
2016-02-18 14:05:52.697 TRACE 12796 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [TIMESTAMP] - [Wed Feb 17 14:00:00 CET 2016]
这是生成的查询:

    select
        my_table0_.date as date1_0_,
        my_table0_.time as time2_0_,
        timestamp(my_table0_.date,
        my_table0_.time) as formula0_ 
    from
        my_table my_table0_ 
    where
        timestamp(my_table0_.date, my_table0_.time) between ? and ?
有没有办法解决这个问题?从Instant切换到其他时间类没有影响(例如java.sql.Timestamp)


更新:它似乎与
时间戳(my_table0.date,my_table0.time)
有关。使用实际的时间戳字段是可行的,但遗憾的是,没有一个字段我不能使用。目前,我正在按日期划分我的语句,并在Java中合并结果,但有另一个解决方案仍然很好。

您正在比较苹果和桔子。。。。执行速度快并不意味着代码中的执行速度必须快。您的代码正在将sql转换为对象,如果它返回1000000行,则需要将其转换为对象。这相当慢。因此,根据行的数量和对象的复杂程度(如果有关系,它甚至可能引发更多查询)。我在开始时也考虑过类似的问题,但经过一些调试后,我确信这不是问题所在。我只得到了大约20个结果,并将@Query改为
@Query(“从MyTable t中选择t,其中t.dateTime介于'2016-02-17 12:00:00'和'2016-02-17 13:00:00'”)
效果很好。这是一个不同的查询。。。不使用函数并且可能使用索引,例如,另一个可能会绕过索引而进行完整表扫描。它会导致这样的WHERE条件:
WHERE时间戳(my_table0_u0.date,my_table0_0.time)介于“2016-02-17 12:00:00”和“2016-02-17 13:00:00”之间,执行速度非常快。唯一的区别是start和end没有作为参数传入,因此我建议绑定这些参数时出现问题,但我不知道这可能是什么。使用查询分析器分析查询,找出不同之处。
    select
        my_table0_.date as date1_0_,
        my_table0_.time as time2_0_,
        timestamp(my_table0_.date,
        my_table0_.time) as formula0_ 
    from
        my_table my_table0_ 
    where
        timestamp(my_table0_.date, my_table0_.time) between ? and ?