1. 程式人生 > >offset fetch 分頁

offset fetch 分頁

SET STATISTICS IO ON
SET STATISTICS TIME ON
 
DECLARE @pageIndex INT=800,@pageSize INT=20
 
SELECT * FROM  Person.Person AS t
ORDER BY t.lastname 
OFFSET (@pageIndex-1)*@pageSize ROWS
FETCH NEXT @pageSize ROWS ONLY;
/*
---------- @pageIndex=1 ----------
(20 行受影響)
表 'Person'。掃描計數 1,邏輯讀取 65 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,佔用時間 = 43 毫秒。
   
---------- @pageIndex=2 ----------
(20 行受影響)
表 'Person'。掃描計數 1,邏輯讀取 125 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,佔用時間 = 106 毫秒。
---------- @pageIndex=800 ----------   
(20 行受影響)
表 'Person'。掃描計數 1,邏輯讀取 49088 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
 SQL Server 執行時間:
   CPU 時間 = 63 毫秒,佔用時間 = 175 毫秒。

是我想說的是被好多人所不關注的一種分頁方法:

 

select * from 表 order by id OFFSET PageIndex*pagenum ROWS FETCH next pagenumrows only

這種方法是不是很簡單,但是這個只有在SQL Server 2012及以上版本中才能使用,無論是從邏輯讀取數還是響應時間實際執行行數等關鍵引數看,SQL Server 2012提供的OFFSET/FETCH NEXT分頁方式都比Row_Number()方式有了較大的提升。

注意:使用該方法必須使用order by ,不然會有語法錯誤。

SELECT * FROM Article_Admin ORDER BY ID DESC OFFSET (2-1)*10 ROWS FETCH NEXT 10 ROWS ONLY

(2-1)*10相當於 (pageIndex當前頁碼-1)*pageSize每頁顯示的條數

10相當於pageSize每頁顯示的條數