Sql Server多種分頁性能的比較

一.前言sql

  由於工做關係,遇到了很是大的數據量的分頁問題,數據總共有8000萬吧,這個顯然不是簡單的分頁可以解決的,須要從多多方面考慮,從分表、分庫等等。可是這個也讓我考慮到了分頁性能的問題,在不一樣數據量的狀況下,不一樣的分頁方法效率是否會有不一樣。我在這裏用比較常見的幾種分頁方法在不一樣的數據量、不一樣頁碼下進行對比,分別是:Top、Row_Number()和Offset Fetch。這裏只用它們分別最簡單的語句,以下。數據庫

  Top:性能

create proc Tops @pageindex int,@pagesize int
AS
BEGIN

select top (@pagesize) * from Customers where CustomerID not in (select top ((@pageindex - 1)* @pagesize) CustomerID from Customers order by CustomerID DESC) order by CustomerID DESC

END

  Row_Number():測試

create proc RowNumber @pageindex int,@pagesize int
AS
BEGIN

select * from (select ROW_NUMBER() OVER(order by CustomerID desc) as px,* from Customers) as a where a.px between ((@pageindex - 1)* @pagesize + 1) and (@pageindex*@pagesize) END

  Offset Fetch:fetch

create proc Offset_Fetch @pageindex int,@pagesize int
AS
BEGIN

select * from Customers order by CustomerID desc offset ((@pageindex - 1) * @pagesize) rows fetch next @pagesize rows only  

END

  三個存儲過程都對數據進行了排序,設置的語句相對公平,這裏默認每頁10條數據。Top的分頁是基本上全部的版本的sql server均可以使用的,row_number()是sql 2005以上,offset fetch須要sql 2012才支持了。spa

 二.20W數據量code

  1.Topserver

    第1頁十次執行平均時間29.1毫秒。blog

    

    第1萬頁十次執行平均時間109.2毫秒。
排序

    

    第2萬頁十次執行平均時間126.8毫秒。

    

  2.Row_Number()

   第1頁十次執行平均時間20.2毫秒。

    

    第1萬頁十次執行平均時間96.5毫秒。

    

    第2萬頁十次執行平均時間153.8毫秒。

    

  3.Offset Fecth

   第1頁十次執行平均時間19.3毫秒。

    

    第1萬頁十次執行平均時間70毫秒。

    

    第2萬頁十次執行平均時間75.1毫秒。

    

三.200W數據量

  1.Top

    第1頁十次執行平均時間55.9毫秒。

     

    第10萬頁十次執行平均時間.....毫秒。

    執行了好幾十秒。。。。直接淘汰

  2.Row_Number()

   第1頁十次執行平均時間25.5毫秒

    

    第10萬頁十次執行平均時間642.3毫秒

    

    第20萬頁十次執行平均時間1257毫秒

    

  3.Offset Fecth

    第1頁十次執行平均時間24.7毫秒

    

    第10萬頁十次執行平均時間220.5毫秒

    

    第20萬頁十次執行平均時間396毫秒

    

三.2000W數據量

  1.Top

   由於在上一輪被淘汰了,因此這一輪就算了。。

  2.Row_Number()

    第1頁十次執行平均時間57毫秒

     

    第100W頁十次執行平均時間6401.5毫秒

    

    第200W頁十次執行平均時間14606.2毫秒

    

  3.Offset Fecth

   第1頁十次執行平均時間27.5毫秒

    

    第100W頁十次執行平均時間1778.9毫秒

    

    第200W頁十次執行平均時間3523.2毫秒

    

四。總結

  能夠看出來數據量越大、分頁頁碼越大對分頁效率影響就越大。top的分頁方法早早出局,很明顯是由於not in 的數據量太龐大了,因此要是有好的top分頁方法能夠下面留言,我也會進行測試。row_number的分頁方法算是比較好的了,並且sql2005及以上的數據庫均可以用,受衆範圍比較大,而offset fecth的性能更加優越,可是隻有sql2012及以上的才支持。

  有什麼問題歡迎討論!

相關文章
相關標籤/搜索