Hibernate JPA-分页、计数(id)缓慢
我有一个REST应用程序,它有一个JPA查询来获取AllObject 运行下面的查询以获取getAll操作的结果集。对于myTable中的3200万行,我的DEV box需要49秒Hibernate JPA-分页、计数(id)缓慢,hibernate,jpa,spring-data-jpa,informix,Hibernate,Jpa,Spring Data Jpa,Informix,我有一个REST应用程序,它有一个JPA查询来获取AllObject 运行下面的查询以获取getAll操作的结果集。对于myTable中的3200万行,我的DEV box需要49秒 select SKIP 200 FIRST 20 * from myTable table0_ order by id desc 然而,我的问题是JPA自动运行count(id)查询以获取分页数据。这个很慢,花了4分钟 select count(id) as col_0_0_ from
select
SKIP 200 FIRST 20 *
from
myTable table0_
order by
id desc
然而,我的问题是JPA自动运行count(id)
查询以获取分页数据。这个很慢,花了4分钟
select count(id) as col_0_0_
from myTable table0_
另外,Id
是表上的主键,直接在DB上的查询本身需要14秒。不确定是否有东西在冬眠状态下减慢了速度
DB是Informix,如果这有什么区别的话。计算行永远不会很快,而且依赖于rdbms。@Antoniosss同意。但是SpringJPA在内部为分页元数据做了这项工作。另外,我假设因为它使用了索引,所以它应该是更快的全扫描搜索。另外,正如我前面所说的,由于直接在DB上运行相同的查询速度更快,所以Hibernate中的某些东西使其速度变慢,因为
id
列是主键,它可能有一个NOTNULL约束,并且上面有一个唯一的索引。你能说服JPA运行COUNT(*)
而不是COUNT(id)
?您是否在myTable
上运行了更新统计信息?如果是,您使用了哪些选项?哪个版本的Informix,运行在哪个平台上(o/s和版本)?表是否可能是易变的?也就是说,表中的行数是否变化很大?COUNT(*)
vsCOUNT(id)
的意义在于后者必须为id
计算非空值的行数,而前者是表中行数的元数据查找。您是否已检查索引是否正常(使用oncheck
)?是否存在磁盘驱动器开始出现故障的危险?(可能不会,但人们知道更有趣的事情会减慢系统的速度。)。这些排有多宽?表中是否有BLOB、CLOB、字节或文本列?问题是什么?