哪种分页最有效率,该如何前端处理大量数据分页

ASP.NET(3)
当数据量很大时,这种分页方法对性能就有很大提高了.概括来说,这种分页方法的实质就是看一页查一页,仅仅查当前页的记录.... 实现的核心就是下面这条查询语句select top PageSize * from TableName where ID not in (select top (CurrentPage-1)*PageSize ID from TableName order by ID) order by IDPageSize : 一页显示的记录数CurrentPage : 当前页码TableName: 表名ID : 主索引排序ID剩下的大家就自己发挥吧,呵呵
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:25493次
排名:千里之外
(1)(1)(1)(2)(2)--------------------------------------第一种:利用动软代码生成器生成的分页------------------------------------//新建一个一般处理程序
pageIndex = int.Parse(HttpContext.Current.Request.Params["page"]);//获取到页数
pageSize = int.Parse(HttpContext.Current.Request.Params["rows"]);//获取每页的大小
total = bll.GetRecordCount(" " );//获取总数
DataSet ds = bll.GetListByPage(" ", "ID", (pageIndex - 1) * pageSize + 1, pageSize * pageIndex);//GetRecordCount,GetListByPage都是生成器生成
list = bll.DataTableToList(ds.Tables[0]);//DataTableToList
var data = new { total = total, rows = list };//EasyUI中的datagrid返回json数据的格式
//将data集合构造成Json字符串
HttpContext.Current.Response.Write(Kits.SerializeToJson(data));//SerializeToJson是在公共类的一个办法
----------------------------------第二种:利用LaomaPager生成类插件来分页----------------------------------------------------------------------------后台页面 protected List&Model.HKSJ_Main& mainShow = new List&Model.HKSJ_Main&();
//实现分页显示图片数据
protected string NavPager { }
protected void Page_Load(object sender, EventArgs e)
//获取网站Main表中的数据
BLL.HKSJ_Main mainServices = new BLL.HKSJ_Main();
//首先获取分页参数
int pageSize = Request["pageSize"] == null ? 10 : Convert.ToInt32(Request["pageSize"]);
int pageIndex = Request["pageIndex"] == null ? 1 : Convert.ToInt32(Request["pageIndex"]);
//获取到totalCount的数据
int totalCount = mainServices.GetRecordCount(string.Empty);
//计算在页面上面显示的分页的数量
DataSet ds = mainServices.GetListByPage(string.Empty, "ID", pageSize * (pageIndex - 1) + 1, pageIndex * pageSize);
//内容数据显示
mainShow = mainServices.DataTableToList(ds.Tables[0]);
//分页数据显示,LaomaPager是封装类插件
NavPager = Common.LaomaPager.ShowPageNavigate(pageSize, pageIndex, totalCount);
注释说明:GetListByPage是生成器里面就可以直接用的,LaomaPager是封装类插件(找一个就好)
--前台页面&div class="pages"&&%=NavPager %&&/div&
--前台页面表格数据&asp:Content ID="Content2" ContentPlaceHolderID="Content" runat="server"&
&table style="width: 100%"&
&th&ID&/th&
&th&title&/th&
&th&content&/th&
&th&people&/th&
&th&date&/th&
&th&status&/th&
&th&MainPeople&/th&
&%foreach (var empoyees in Empoyees)
&td&&%=empoyees.ID %&&/td&
&td&&%=empoyees.title %&&/td&
&td&&%=empoyees.content %&&/td&
&td&&%=empoyees.people %&&/td&
&td&&%=empoyees.date %&&/td&
&td&&%=empoyees.status %&&/td&
&td&&%=empoyees.MainPeople %&&/td&
&/asp:Content&&asp:Content ID="Content3" ContentPlaceHolderID="NavPage" runat="server"&
&%=NavPager %&&/asp:Content&
--------------------------------------第三种:利用存储过程分页--------------------------------------------------//新建一个一般处理程序
//接收表格的分页数据
strPageIndex = context.Request.Params["page"];
strPageSize = context.Request.Params["rows"];
PagedData pageData = new PagedData() { PageIndex = int.Parse(strPageIndex), PageSize = int.Parse(strPageSize) };//PagedData 是一个公共类,如下面
//调用存储过程来查询数据 并使用out 修改输出参数的值
var workFlowList = workFlowBll.GetPageDataByProcedure(int.Parse(strPageIndex), int.Parse(strPageSize), "IsDel='false'", out rowCount);
//List&NanFang_WorkFlowNode& workFlowNodeList = workFlowNodeBll.GetModelList(" IsDel='false'");
//将必要的数据赋值给EasyUI需要的变量
pageData.rows = workFlowL
pageData.total = rowC
string str=Kits.SerializeToJson(pageData);
context.Response.Write(str);
//PagedData公共类public class PagedData
public int PageI
public int PageS
// RowC 是为 EasyUI的datagrid组件 而改
//PagedL 是为 EasyUI的datagrid组件 而改
public int PageCount
return (int)Math.Ceiling(Convert.ToDouble(total) / Convert.ToDouble(PageSize));
}//在BLL层添加public List&NanFang.Model.NanFang_WorkFlow& GetPageDataByProcedure(int pageIndex, int pageSize, string strWhere, out int rowsCount)
DataSet ds = dal.GetPageDataByProcedure(pageIndex, pageSize, strWhere, out rowsCount);
return DataTableToList(ds.Tables[0]);
}//在IDAL层添加 DataSet GetPageDataByProcedure(int PageIndex, int PageSize, string strWhere, out int rowsCount);//在DAL层添加 public DataSet GetPageDataByProcedure(int PageIndex, int PageSize, string strWhere, out int rowsCount)
SqlParameter[] parameters = {
new SqlParameter("@pageIndex", SqlDbType.Int),
new SqlParameter("@pageSize", SqlDbType.Int),
new SqlParameter("@strWhere", SqlDbType.NVarChar,200),
new SqlParameter("@rowCount", SqlDbType.Int)
parameters[0].Value = PageI
parameters[1].Value = PageS
parameters[2].Value = strW
parameters[3].Direction = ParameterDirection.O
return DbHelperSQL.RunProcedure("usp_GetWorkFlowPage", parameters, out rowsCount);//RunProcedure办法是代码生成器自带的
}//在数据库中写的存储过程
USE [NanFang_Hospital]GO/****** Object:
StoredProcedure [dbo].[usp_GetWorkFlowPage]
Script Date: 04/02/:25 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER procedure [dbo].[usp_GetWorkFlowPage]
@pageIndex int,--查询的起始页
@pageSize int,--每页多少条数据
@strWhere nvarchar(200),--查询workFlow表的条件
@rowCount int output --输出函数ASBEGIN
declare @startNum nvarchar(10),--当前页开始的索引
@endNum nvarchar(10),--当前页结束索引
@sqlCount nvarchar(300),--查询数据的总行数
@sqlSelect nvarchar(300)
set @startNum=cast((@pageIndex-1)*@pageSize as nvarchar(10))--计算当前页开始的索引
set @endNum=cast(@pageIndex*@pageSize as nvarchar(10))--计算当前页结束的索引
--判断是否有条件的查询
if(LEN(@strWhere)&1)
--有条件的查询就执行下面语句
@sqlCount=N'select @rowCount=count(ID) from dbo.NanFang_WorkFlow where '+@strWhere
@sqlSelect='select k.* from (select ROW_NUMBER() over(order by ID) AS num,*
FROM dbo.NanFang_WorkFlow
'+@strWhere+') as k where k.num&'+@startNum+' and k.num&='+@endNum+' order by k.AddTime asc '
@sqlCount=N'select @rowCount=count(ID) from dbo.NanFang_WorkFlow '
@sqlSelect='select k.* from (select ROW_NUMBER() over(order by ID) AS num,*
FROM dbo.NanFang_WorkFlow ) as k where k.num&'+@startNum+' and k.num&='+@endNum+' order by k.AddTime asc '
--查询总行数:执行系统内置的存储过程
exec sp_executesql @sqlCount,N'@rowCount int output',@rowCount output
exec sp_executesql @sqlSelectEND
阅读(...) 评论()几种常见SQL分页方式效率比较 - 欧先生 - 博客园
随笔 - 5, 文章 - 0, 评论 - 40, 引用 - 0
&分页很重要,面试会遇到。不妨再回顾总结一下。
1.创建测试环境,(插入100万条数据大概耗时5分钟)。
create database DBTestuse DBTest--创建测试表create table pagetest(id int identity(1,1) not null,col01 int null,col02 nvarchar(50) null,col03 datetime null)--1万记录集declare @i intset @i=0while(@i&10000)begin
insert into pagetest select cast(floor(rand()*10000) as int),left(newid(),10),getdate()
set @i=@i+1end
2.几种典型的分页sql,下面例子是每页50条,198*50=9900,取第199页数据。
--写法1,not in/topselect top 50 * from pagetest where id not in (select top 9900 id from pagetest order by id)order by id--写法2,not existsselect top 50 * from pagetest where not exists (select 1 from (select top 9900 id from pagetest order by id)a
where a.id=pagetest.id)order by id--写法3,max/topselect top 50 * from pagetestwhere id&(select max(id) from (select top 9900 id from pagetest order by id)a)order by id--写法4,row_number()select top 50 * from (select row_number()over(order by id)rownumber,* from pagetest)awhere rownumber&9900select * from (select row_number()over(order by id)rownumber,* from pagetest)awhere rownumber&9900 and rownumber&9951select * from (select row_number()over(order by id)rownumber,* from pagetest)awhere rownumber between 9901 and 9950--写法5,在csdn上一帖子看到的,row_number() 变体,不基于已有字段产生记录序号,先按条件筛选以及排好序,再在结果集上给一常量列用于产生记录序号select *from (
select row_number()over(order by tempColumn)rownumber,*
from (select top 9950 tempColumn=0,* from pagetest where 1=1 order by id)a)bwhere rownumber&9900
3.分别在1万,10万(取1990页),100(取19900页)记录集下测试。
declare @begin_date datetimedeclare @end_date datetimeselect @begin_date = getdate()&.....YOUR CODE.....&select @end_date = getdate()select datediff(ms,@begin_date,@end_date) as '毫秒'
1万:基本感觉不到差异。
1.max/top,ROW_NUMBER()都是比较不错的分页方法。相比ROW_NUMBER()只支持sql2005及以上版本,max/top有更好的可移植性,能同时适用于sql2000,access。
2.not exists感觉是要比not in效率高一点点。
3.ROW_NUMBER()的3种不同写法效率看起来差不多。
4.ROW_NUMBER() 的变体基于我这个测试效率实在不好。原帖在这里
PS.上面的分页排序都是基于自增字段id。测试环境还提供了int,nvarchar,datetime类型字段,也可以试试。不过对于非主键没索引的大数据量排序效率应该是很不理想的。
5.简单将ROWNUMBER,max/top的方式封装到存储过程。
ROWNUMBER():
create proc [dbo].[spSqlPageByRownumber]@tbName varchar(255),
--表名@tbFields varchar(1000),
--返回字段@PageSize int,
--页尺寸@PageIndex int,
--页码@strWhere varchar(1000),
--查询条件@StrOrder varchar(255),
--排序条件@Total int output
--返回总记录数asdeclare @strSql varchar(5000)
--主语句declare @strSqlCount nvarchar(500)--查询记录总数主语句--------------总记录数---------------if @strWhere !=''beginset @strSqlCount='Select @TotalCout=count(*) from
' + @tbName + ' where '+ @strWhereendelsebeginset @strSqlCount='Select @TotalCout=count(*) from
' + @tbNameend--------------分页------------if @PageIndex &= 0begin
set @PageIndex = 1endset @strSql='Select * from (Select
row_number() over('+@strOrder+') rowId,'+ @tbFields+' from ' + @tbName + ' where 1=1 ' + @strWhere+' ) tb where tb.rowId &'+str((@PageIndex-1)*@PageSize)+' and tb.rowId &= ' +str(@PageIndex*@PageSize)exec sp_executesql @strSqlCount,N'@TotalCout int output',@Total outputexec(@strSql)
Max/top:(简单写了下,需要满足主键字段名称就是"id")
create proc [dbo].[spSqlPageByMaxTop]@tbName varchar(255),
--表名@tbFields varchar(1000),
--返回字段@PageSize int,
--页尺寸@PageIndex int,
--页码@strWhere varchar(1000),
--查询条件@StrOrder varchar(255),
--排序条件@Total int output
--返回总记录数asdeclare @strSql varchar(5000)
--主语句declare @strSqlCount nvarchar(500)--查询记录总数主语句--------------总记录数---------------if @strWhere !=''beginset @strSqlCount='Select @TotalCout=count(*) from
' + @tbName + ' where '+ @strWhereendelsebeginset @strSqlCount='Select @TotalCout=count(*) from
' + @tbNameend--------------分页------------if @PageIndex &= 0begin
set @PageIndex = 1endset @strSql='select top '+str(@PageSize)+' * from ' + @tbName + 'where id&(select max(id) from (select top '+str((@PageIndex-1)*@PageSize)+' id from ' + @tbName + ''+@strOrder+')a)'+@strOrder+''exec sp_executesql @strSqlCount,N'@TotalCout int output',@Total outputexec(@strSql)
园子里搜到Max/top这么一个版本,看起来很强大,
declare @count int--exec [dbo].[spSqlPageByRownumber]'pagetest','*',50,20,'','order by id asc',@count output exec [dbo].[spSqlPageByMaxTop]'pagetest','*',50,20,'','order by id asc',@count output select @count关于分页显示的高效率解决办法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
关于分页显示的高效率解决办法
上传于|0|0|文档简介
&&Mysql分页,SQLServer分页,如何高效率分页,大数据量分页显示
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢2014年6月 .NET技术大版内专家分月排行榜第二2014年1月 .NET技术大版内专家分月排行榜第二
2014年2月 .NET技术大版内专家分月排行榜第三2013年4月 .NET技术大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 tp5.0分页数据处理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信