一.前言

  因为工作关系,遇到了非常大的数据量的分页问题,数据总共有8000万吧,这个显然不是简单的分页能够解决的,需要从多多方面考虑,从分表、分库等等。但是这个也让我考虑到了分页性能的问题,在不同数据量的情况下,不同的分页方法效率是否会有不同。我在这里用比较常见的几种分页方法在不同的数据量、不同页码下进行对比,分别是:Top、Row_Number()和Offset Fetch。这里只用它们分别最简单的语句,如下。

  Top:

Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
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
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

  Row_Number():

Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
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
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

  Offset Fetch:

Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
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
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

  三个存储过程都对数据进行了排序,设置的语句相对公平,这里默认每页10条数据。Top的分页是基本上所有的版本的sql server都可以使用的,row_number()是sql 2005以上,offset fetch需要sql 2012才支持了。

 二.20W数据量

  1.Top

    第1页十次执行平均时间29.1毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第1万页十次执行平均时间109.2毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第2万页十次执行平均时间126.8毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

  2.Row_Number()

   第1页十次执行平均时间20.2毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第1万页十次执行平均时间96.5毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第2万页十次执行平均时间153.8毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

  3.Offset Fecth

   第1页十次执行平均时间19.3毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第1万页十次执行平均时间70毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第2万页十次执行平均时间75.1毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

三.200W数据量

  1.Top

    第1页十次执行平均时间55.9毫秒。

     Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第10万页十次执行平均时间.....毫秒。

    执行了好几十秒。。。。直接淘汰

  2.Row_Number()

   第1页十次执行平均时间25.5毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第10万页十次执行平均时间642.3毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第20万页十次执行平均时间1257毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

  3.Offset Fecth

    第1页十次执行平均时间24.7毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第10万页十次执行平均时间220.5毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第20万页十次执行平均时间396毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

三.2000W数据量

  1.Top

   因为在上一轮被淘汰了,所以这一轮就算了。。

  2.Row_Number()

    第1页十次执行平均时间57毫秒

     Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第100W页十次执行平均时间6401.5毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第200W页十次执行平均时间14606.2毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

  3.Offset Fecth

   第1页十次执行平均时间27.5毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第100W页十次执行平均时间1778.9毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第200W页十次执行平均时间3523.2毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

四。总结

  可以看出来数据量越大、分页页码越大对分页效率影响就越大。top的分页方法早早出局,很明显是因为not in 的数据量太庞大了,所以要是有好的top分页方法可以下面留言,我也会进行测试。row_number的分页方法算是比较好的了,而且sql2005及以上的数据库都可以用,受众范围比较大,而offset fecth的性能更加优越,但是只有sql2012及以上的才支持。

一.前言

  因为工作关系,遇到了非常大的数据量的分页问题,数据总共有8000万吧,这个显然不是简单的分页能够解决的,需要从多多方面考虑,从分表、分库等等。但是这个也让我考虑到了分页性能的问题,在不同数据量的情况下,不同的分页方法效率是否会有不同。我在这里用比较常见的几种分页方法在不同的数据量、不同页码下进行对比,分别是:Top、Row_Number()和Offset Fetch。这里只用它们分别最简单的语句,如下。

  Top:

Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
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
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

  Row_Number():

Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
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
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

  Offset Fetch:

Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
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
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较
Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

  三个存储过程都对数据进行了排序,设置的语句相对公平,这里默认每页10条数据。Top的分页是基本上所有的版本的sql server都可以使用的,row_number()是sql 2005以上,offset fetch需要sql 2012才支持了。

 二.20W数据量

  1.Top

    第1页十次执行平均时间29.1毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第1万页十次执行平均时间109.2毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第2万页十次执行平均时间126.8毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

  2.Row_Number()

   第1页十次执行平均时间20.2毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第1万页十次执行平均时间96.5毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第2万页十次执行平均时间153.8毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

  3.Offset Fecth

   第1页十次执行平均时间19.3毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第1万页十次执行平均时间70毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第2万页十次执行平均时间75.1毫秒。

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

三.200W数据量

  1.Top

    第1页十次执行平均时间55.9毫秒。

     Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第10万页十次执行平均时间.....毫秒。

    执行了好几十秒。。。。直接淘汰

  2.Row_Number()

   第1页十次执行平均时间25.5毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第10万页十次执行平均时间642.3毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第20万页十次执行平均时间1257毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

  3.Offset Fecth

    第1页十次执行平均时间24.7毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第10万页十次执行平均时间220.5毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第20万页十次执行平均时间396毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

三.2000W数据量

  1.Top

   因为在上一轮被淘汰了,所以这一轮就算了。。

  2.Row_Number()

    第1页十次执行平均时间57毫秒

     Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第100W页十次执行平均时间6401.5毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第200W页十次执行平均时间14606.2毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

  3.Offset Fecth

   第1页十次执行平均时间27.5毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第100W页十次执行平均时间1778.9毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

    第200W页十次执行平均时间3523.2毫秒

    Sql Server多种分页性能的比较
    




Sql Server多种分页性能的比较

四。总结

  可以看出来数据量越大、分页页码越大对分页效率影响就越大。top的分页方法早早出局,很明显是因为not in 的数据量太庞大了,所以要是有好的top分页方法可以下面留言,我也会进行测试。row_number的分页方法算是比较好的了,而且sql2005及以上的数据库都可以用,受众范围比较大,而offset fecth的性能更加优越,但是只有sql2012及以上的才支持。

相关文章: