2017-06-13 28 views
1

我試圖在春季使用PagingAndSortingRepository,休眠和SQL Server 2014實現服務器端分頁。它工作正常,但東西似乎關閉表現。 頁面越遠,加載時間就越長。休眠和SQL Server 2014的春季數據分頁的性能問題

由休眠記錄的查詢如下(我已經去除了大部分列名):

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 。

當表格中有400000行時,查詢最後一頁約需1.2秒,第一頁約需60ms。

使用Eclipse的SQL客戶端執行查詢需要幾秒鐘,不管我查詢哪個頁面。

我使用4.3.10.Final版本休眠和1.10.2.RELEASE版本彈簧數據的JPA的。

您是否知道可能導致此類性能問題的原因以及如何解決?

回答

0

在此查詢中,您要求SQL對前N行進行編號,然後返回編號爲N-M至N的行。隨着N增加,SQL必須掃描並編號更多行,導致成本增加。

爲了最大限度地減少編號的成本,在排序列(這裏是IncidentID)上提供了一個「瘦」索引。如果IncidentiID是一個集羣主鍵,那麼SQL將掃描包含非鍵列的所有數據頁面以執行編號步驟。