`
lovnet
  • 浏览: 7032165 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

分页实现方法的性能比较

 
阅读更多

我们先给出几种主要的分页方法和核心语句,然后直接给出结论,有兴趣的读者可以看看后面的数据

几种常用存储过程分页方法

TopN方法

select Top(@PageSize) from TableName where ID Not IN

(Select Top ((@PageIndex-1)*@PageSize)ID from Table Name where .... order by ... )

where .... order by ...

临时表

declare @indextable table(id int identity(1,1),nid int,PostUserName nvarchar(50))

declare @PageLowerBound int

declare @PageUpperBound int

set @PageLowerBound=(@pageindex-1)*@pagesize--下限

set @PageUpperBound=@PageLowerBound+@pagesize--上限

set rowcount @PageUpperBound

insert into @indextable(nid,PostUserName) select ReplyID,PostUserName from TableName order by ......

select * from TableName p,@indextable t where p.ID=t.nid

and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id

CTE--2005新语法,类似临时表,但是生命周期稍微不同,这里只是他的一个运用

withcte_temp--定义零时表,PageIndex是一个计算字段,储存了搜索结果的页号

As (ceiling((Row_Number() over(order by.... )-1)/@pagesize as int) as PageIndex,* from TableName where.....)
select * fromcte_temp where pageindex=@pageindex-1;

结论:

TopN在小页数下最快,如果在10页以下,可以考虑用它,CTE和临时表时间很稳定,CTE消耗的时间比临时表多,但是不会引起tempdb的暴涨和IO增加

性能比较

试验环境:win2003server,Sqlserver2005,库大小2,567,245行,没有where子句,试验时每页大小50,页码作为变量

取0,3,10,31,100,316,1000,3162...页,也就是10的指数,试验结果如下

页数 TopN CTE 临时表(有缓存)

临时表(无缓存)

公司正在使用的存储过程 CTE改进
1 3 12 10 101 457 7302
3 15 7 79 5524 464 7191
10 127 5504 88 3801 464 6116
32 588 9672 122 3601 976 7602
100 4680 9738 166 4235 486 7151
316 45271 9764 323 3867 522 7255
1000 Null 9806 869 2578 635 8948
3162 Null 9822 2485 4110 12460 8210
10000 Null 9754 7812 11926 14250 7359
31623 Null 9775 18729 33218 15249 7511
100000 Null Null 31538 55569 17139 6124

数据解释和分析

临时表分为有没有缓存两种时间,CTE就是上面的方法,CTE改进只是把选入CTE临时表的列数减少了,只选取了页号和主键,Null表示时间无法计算(时间太长),数据单位是毫秒.

从上面的数据可以看到,TopN在前32页都是有优势的,但是页数增大后,性能降低很快,CTE改进比CTE有所进步,平均进步两秒左右,但是还是比临时表慢,但是考虑临时表会增大日志文件的大小,引起大量IO,CTE也就有他自己的优势,公司现在正在使用的存储过程效率不错,但是在页码靠后的情况下性能会降低

分享到:
评论

相关推荐

    利用假分页实现分页的代码

    以下是如何利用假分页实现分页的一些建议: 1. **前端处理**:前端需要维护一个状态,包括当前页码、每页显示的条目数等。当用户触发翻页操作时,前端根据这些状态构建请求参数,发送HTTP请求到服务器。 2. **动态...

    C# winform程序实现分页的方法

    因此,实现有效的分页功能对于提升用户体验和系统性能至关重要。本文将详细介绍如何在C# Winform程序中通过数据库存储过程来实现分页功能。 #### 一、分页的重要性及原理 1. **重要性**:分页可以避免一次性加载...

    nodejs mysql 实现分页的方法

    Node.js结合MySQL实现分页查询是一种常见的数据处理方式,在Web应用中尤为常见。分页可以有效提高页面的响应速度,并优化用户的浏览体验。本文主要介绍了在Node.js环境下,如何使用MySQL数据库实现分页功能。 首先...

    DataList分页技巧方法

    DataList分页技巧方法 DataList分页技巧方法是一种实现DataList和Repeater控件的分页显示的方法。...使用PagedDataSource类可以轻松实现DataList和Repeater控件的分页显示,提高了开发效率和应用性能。

    struts2.0实现的数据分页实现及实现分页步骤

    Struts2.0 是一个流行的Java Web开发框架,它提供了一种组织和控制MVC(Model-...同时,随着技术的发展,现代的Web应用可能更倾向于使用ORM框架(如Hibernate)和前端分页库(如jQuery DataTables)来简化分页实现。

    海量数据高性能分页新法

    本文介绍了一种针对海量数据的高性能分页方法,通过对复合键的应用实现了高效的分页查询。与传统的分页方法相比,该方法不仅提高了查询效率,还解决了数据分布不均等问题。在实际应用中,可以根据具体需求调整复合键...

    mysql数据库实现分页

    以下是对分页实现的详细说明: 一、基础概念 分页是将数据库查询结果分割成多个页面,每次请求只返回一部分数据,而不是一次性返回所有数据。这在Web应用中尤其常见,如搜索引擎、电商网站等,用户通常会通过点击...

    java实现的一个分页程序

    3. **Page对象**:为了更好地封装分页信息,开发者通常会创建一个Page或Pagination对象,包含当前页码、每页记录数、总页数等属性,以及获取数据的方法。 4. **Spring Data JPA分页**:如果你使用Spring框架,...

    sql实现分页查询的各种方法比较

    本文将深入探讨SQL实现分页查询的各种方法,并比较它们的性能差异。 ### SQL实现分页查询的方法 #### 方法一:使用`NOT IN`子句 在SQL Server 2000/2005版本中,一种常见的分页查询实现方式是通过`NOT IN`子句。...

    STRUTS2+HIBERNATE详细的分页实现代码详细的分页实现代码

    在Action类中,我们需要处理来自用户的请求参数,如当前页码和每页显示记录数等,并调用DAO中的分页查询方法获取数据。然后将这些数据传递给视图层进行展示。 #### 示例代码分析 下面是一个简化的示例代码片段,...

    SSM框架分页的实现

    MyBatis提供了PageHelper分页插件,简化了分页实现。首先需要在项目的pom.xml文件中添加PageHelper依赖,然后在MyBatis的配置文件中启用插件,并设置相关属性如dialect(数据库类型)、reasonable(是否启用合理化...

    hbase分页查询实现.pdf

    作者使用了getDataMap()方法来实现分页查询。该方法传入了表名、开始行、结束行、当前页码和页大小等参数,并返回了结果集。作者使用了ResultScanner来扫描表数据,并使用了Filter来实现分页查询。 知识点6:Filter...

    WPF 分页DataGrid 分页控件的实现

    在Windows Presentation Foundation (WPF) 中,开发人员...总的来说,通过正确使用ICollectionView和适当的事件处理,WPF开发者可以轻松地在DataGrid中实现高效且用户友好的分页功能,从而提升应用的性能和用户体验。

    android Gridview分页实现

    当我们处理大量数据时,分页加载可以提高应用性能,减少内存消耗,并提供更好的用户体验。本篇文章将详细讲解如何在Android中利用GridView实现分页加载功能。 首先,理解GridView的基本概念。GridView是ListView的...

    一款非常简单的分页实现方法,适合新手使用。

    标题提到的是一款适合新手使用的简单分页实现方法,我们将深入探讨这个话题。 首先,前端分页与后端分页是两种主要的分页方式。前端分页,正如描述中所述,是指在客户端(用户浏览器)上执行分页逻辑。这种实现方法...

    用recyclerview实现分页滑动,横向纵向分页

    在Android开发中,RecyclerView是一个非常重要的组件,它用于展示可滚动的数据集,具有高度的可定制性和性能优化。...在实际项目中,根据需求和资源选择合适的分页实现方式,并不断优化,以提高应用的性能和用户体验。

    简单web分页实现

    本篇文章将深入探讨“简单web分页实现”的概念、原理以及实现方法。 首先,我们要理解分页的基本原理。分页通常涉及到两个主要方面:前端显示和后端数据处理。前端负责展示页面上的导航元素(如页码),并根据用户...

    java多种分页实现

    ### Struts框架下的分页实现 #### 1. 基本思路与流程 在Struts框架中,分页主要涉及以下几个步骤: - 首先,确定每页显示的记录数。 - 其次,计算总页数和当前页码。 - 再次,根据当前页码获取相应的数据集。 - ...

    oracle分页程序的实现

    以下将详细介绍Oracle数据库中实现分页查询的方法以及相关知识点。 在Oracle数据库中,常见的分页查询方法有ROWNUM和ROW_NUMBER()函数,以及使用子查询和连接操作来实现分页。 1. ROWNUM方法: ROWNUM是Oracle中的...

Global site tag (gtag.js) - Google Analytics