我们先给出几种主要的分页方法和核心语句,然后直接给出结论,有兴趣的读者可以看看后面的数据
几种常用存储过程分页方法
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程序中通过数据库存储过程来实现分页功能。 #### 一、分页的重要性及原理 1. **重要性**:分页可以避免一次性加载...
Node.js结合MySQL实现分页查询是一种常见的数据处理方式,在Web应用中尤为常见。分页可以有效提高页面的响应速度,并优化用户的浏览体验。本文主要介绍了在Node.js环境下,如何使用MySQL数据库实现分页功能。 首先...
DataList分页技巧方法 DataList分页技巧方法是一种实现DataList和Repeater控件的分页显示的方法。...使用PagedDataSource类可以轻松实现DataList和Repeater控件的分页显示,提高了开发效率和应用性能。
Struts2.0 是一个流行的Java Web开发框架,它提供了一种组织和控制MVC(Model-...同时,随着技术的发展,现代的Web应用可能更倾向于使用ORM框架(如Hibernate)和前端分页库(如jQuery DataTables)来简化分页实现。
本文介绍了一种针对海量数据的高性能分页方法,通过对复合键的应用实现了高效的分页查询。与传统的分页方法相比,该方法不仅提高了查询效率,还解决了数据分布不均等问题。在实际应用中,可以根据具体需求调整复合键...
以下是对分页实现的详细说明: 一、基础概念 分页是将数据库查询结果分割成多个页面,每次请求只返回一部分数据,而不是一次性返回所有数据。这在Web应用中尤其常见,如搜索引擎、电商网站等,用户通常会通过点击...
3. **Page对象**:为了更好地封装分页信息,开发者通常会创建一个Page或Pagination对象,包含当前页码、每页记录数、总页数等属性,以及获取数据的方法。 4. **Spring Data JPA分页**:如果你使用Spring框架,...
本文将深入探讨SQL实现分页查询的各种方法,并比较它们的性能差异。 ### SQL实现分页查询的方法 #### 方法一:使用`NOT IN`子句 在SQL Server 2000/2005版本中,一种常见的分页查询实现方式是通过`NOT IN`子句。...
在Action类中,我们需要处理来自用户的请求参数,如当前页码和每页显示记录数等,并调用DAO中的分页查询方法获取数据。然后将这些数据传递给视图层进行展示。 #### 示例代码分析 下面是一个简化的示例代码片段,...
MyBatis提供了PageHelper分页插件,简化了分页实现。首先需要在项目的pom.xml文件中添加PageHelper依赖,然后在MyBatis的配置文件中启用插件,并设置相关属性如dialect(数据库类型)、reasonable(是否启用合理化...
作者使用了getDataMap()方法来实现分页查询。该方法传入了表名、开始行、结束行、当前页码和页大小等参数,并返回了结果集。作者使用了ResultScanner来扫描表数据,并使用了Filter来实现分页查询。 知识点6:Filter...
在Windows Presentation Foundation (WPF) 中,开发人员...总的来说,通过正确使用ICollectionView和适当的事件处理,WPF开发者可以轻松地在DataGrid中实现高效且用户友好的分页功能,从而提升应用的性能和用户体验。
当我们处理大量数据时,分页加载可以提高应用性能,减少内存消耗,并提供更好的用户体验。本篇文章将详细讲解如何在Android中利用GridView实现分页加载功能。 首先,理解GridView的基本概念。GridView是ListView的...
标题提到的是一款适合新手使用的简单分页实现方法,我们将深入探讨这个话题。 首先,前端分页与后端分页是两种主要的分页方式。前端分页,正如描述中所述,是指在客户端(用户浏览器)上执行分页逻辑。这种实现方法...
在Android开发中,RecyclerView是一个非常重要的组件,它用于展示可滚动的数据集,具有高度的可定制性和性能优化。...在实际项目中,根据需求和资源选择合适的分页实现方式,并不断优化,以提高应用的性能和用户体验。
本篇文章将深入探讨“简单web分页实现”的概念、原理以及实现方法。 首先,我们要理解分页的基本原理。分页通常涉及到两个主要方面:前端显示和后端数据处理。前端负责展示页面上的导航元素(如页码),并根据用户...
### Struts框架下的分页实现 #### 1. 基本思路与流程 在Struts框架中,分页主要涉及以下几个步骤: - 首先,确定每页显示的记录数。 - 其次,计算总页数和当前页码。 - 再次,根据当前页码获取相应的数据集。 - ...
以下将详细介绍Oracle数据库中实现分页查询的方法以及相关知识点。 在Oracle数据库中,常见的分页查询方法有ROWNUM和ROW_NUMBER()函数,以及使用子查询和连接操作来实现分页。 1. ROWNUM方法: ROWNUM是Oracle中的...