zoukankan      html  css  js  c++  java
  • 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及以上的才支持。

      有什么问题欢迎讨论!

        

  • 相关阅读:
    [译文] 实体与值对象到底是不是一回事?
    实现 WebApi 自托管服务宿主于 WinForms 及其交互
    [译文] C# 8 已成旧闻, 向前, 抵达 C# 9!
    [译文] 为什么你在 C# 里总是应该使用 "var" 关键字
    通过设置iis在局域网中访问网页
    windows 10 安装使用kafka
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 4) 整合Polly实现瞬时故障处理
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 3) 使用Handler实现传出请求中间件
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 2) 定义命名化和类型化的客户端
    Asp.net Core 2.0 OpenId Connect Handler缺失Claims?
  • 原文地址:https://www.cnblogs.com/xwc1996/p/9113049.html
Copyright © 2011-2022 走看看