我试图在春天使用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。
您知道可能导致此类性能问题的原因以及如何解决这个问题吗?
答案 0 :(得分:0)
在此查询中,您要求SQL对前N行进行编号,然后返回编号为N-M到N的行。随着N的增加,SQL必须扫描并编号更多行,从而导致成本增加。
为了最小化编号成本,行在排序列上提供了“瘦”索引(此处为IncidentID)。如果IncidentiID是群集主键,则SQL将扫描包含非键列的所有数据页以执行编号步骤。