使用hibernate和SQL Server 2014进行Spring数据分页的性能问题

时间:2017-06-13 14:09:03

标签: sql-server spring hibernate jpa spring-data

我试图在春天使用PagingAndSortingRepository,hibernate和SQL Server 2014来实现服务器端分页。它工作正常,但似乎有些事情与性能有关。 页面越远,加载它所需的时间就越长。

hibernate记录的查询如下(我删除了大部分列名称):

WITH query 
   AS (SELECT inner_query.*,
      ROW_NUMBER() 
         OVER (
            ORDER BY CURRENT_TIMESTAMP) as __hibernate_row_nr__ 
   FROM ( select TOP(?) incidentli0_.IncidentId as Incident1_18_ 
FROM IncidentList incidentli0_ order by incidentli0_.IncidentId desc 
) inner_query ) 
SELECT Incident1_18_
FROM query
WHERE __hibernate_row_nr__ >= ? AND __hibernate_row_nr__ < ?

根据this answer,这是SQL Server的分页查询的正确方式。

当表格中有400 000行时,最后一页的查询大约需要1.2秒,第一页大约需要60毫秒。

使用Eclipse的SQL客户端执行查询需要几毫秒,而不是我查询的页面。

我正在使用 4.3.10.Final 版本的hibernate和 1.10.2.RELEASE 版本的spring-data-jpa。

您知道可能导致此类性能问题的原因以及如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

在此查询中,您要求SQL对前N行进行编号,然后返回编号为N-M到N的行。随着N的增加,SQL必须扫描并编号更多行,从而导致成本增加。

为了最小化编号成本,行在排序列上提供了“瘦”索引(此处为IncidentID)。如果IncidentiID是群集主键,则SQL将扫描包含非键列的所有数据页以执行编号步骤。