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每頁顯示的條數