1. 程式人生 > 實用技巧 >Sql Server多種分頁效能的比較

Sql Server多種分頁效能的比較

Sql Server多種分頁效能的比較

一.前言

  因為工作關係,遇到了非常大的資料量的分頁問題,資料總共有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:

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才支援了。

二.20W資料量

  1.Top

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

    

    第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及以上的才支援。