sqlserver 分頁方法

本文分別介紹三種sqlserver分頁方式。並開啓statistics做爲統計。

開啓統計:

--清理
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
--開啓統計信息
SET STATISTICS TIME ON
SET STATISTICS IO ON

使用top

方法一:

優點:通用,第一頁可以直接把第二個數字2設置爲0即可。統計結果表明,主要的性能消耗在IO上。對比了方法二後,建議如果堅持使用top,還是用【方法二】會比較好——方法二的邏輯讀取次數會小很多。

缺點:兩層嵌套,對於大表還是壓力很大的。而且讀取次數很多。

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
--開啓統計信息
SET STATISTICS TIME ON
SET STATISTICS IO ON

SELECT TOP 2 * FROM vvtest WHERE ID NOT IN --這裏的2:每頁展示的數量
(SELECT TOP 2 ID FROM vvtest ORDER BY id) --這裏的2=頁碼*每頁展示的數量,這裏是1*2。
ORDER BY id

方法二(如用top時,建議使用):

優點:邏輯比較直白的,適合小白入門。邏輯讀取次數不會根據頁碼不同而變。查看統計結果後,主要的性能消耗還是在IO。

缺點:腳本三層嵌套很冗餘。而且第一頁的腳本不能複用。要單獨寫。

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
--開啓統計信息
SET STATISTICS TIME ON
SET STATISTICS IO ON

select top 2 id,name from vvtest where id>=--這裏的2是每頁展示的數量
(select max(id) from (select top 2 id from vvtest order by id ) --這裏的2=頁碼*每頁數量,頁碼不能爲0
tmp_max_table)order by id 

 

使用row_number

優點:性能比top方式好。

缺點:還是需要使用兩層嵌套。代碼看起來會較複雜。而且執行起來發現性能變化還蠻大的,主要變化在IO消耗的時間上。(下圖的統計信息只是其中一次。不作爲比較性能的直接證據)

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
--開啓統計信息
SET STATISTICS TIME ON
SET STATISTICS IO ON

select top 2 * --這裏的2是每頁展示的數量
from (select row_number() 
over(order by id asc) as rownumber,* 
from vvtest) temp_row
where rownumber>((1-1)*2);--這裏對應的公式是:(頁碼-1)*每頁展示的數量,頁碼從1開始。

 

使用row fetch next

優:代碼很簡單。

缺:sqlserver 2012版本以上才能使用。

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
--開啓統計信息
SET STATISTICS TIME ON
SET STATISTICS IO ON

SELECT [id]
      ,[name]
  FROM [master].[dbo].[vvtest]
  order by name  desc offset (3-1)*2 row fetch next 2 row only --這裏對應的公式是:(頁碼-1)*每頁展示的數量,頁碼從1開始。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章