【问题标题】:Performance issues of Spring data paging with hibernate and SQL Server 2014使用 hibernate 和 SQL Server 2014 的 Spring 数据分页的性能问题
【发布时间】:2017-11-15 09:03:09
【问题描述】:

我正在尝试使用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。

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

【问题讨论】:

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


    【解决方案1】:

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

    为了尽量减少对行进行编号的成本,请在排序列(此处为 IncidentID)上提供一个“精简”索引。如果 IncidentiID 是集群主键,则 SQL 将扫描所有包含非键列的数据页以执行编号步骤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 2023-03-24
      • 2014-12-02
      • 1970-01-01
      • 2018-02-07
      • 2016-09-30
      • 2013-10-07
      相关资源
      最近更新 更多