一套新的SqlServer2005分页方案,很实用,很快!(总结了一下大家的讨论)
-----------------------
以下为6月25日补充:
-----------------------
感谢大家的讨论,我总结一下集中讨论的焦点:
1、为什么要使用row方案:
在oracle里有row_number虚列,
mySql有limit关键字分页,
他们都有一个比较通用的分页方案,
使得hibernate等类似的程序可以拼接sql字符串提供通用的分页。
而sqlserver却没有这样的分页方案。
于是乎,本人稍稍改装row_number()over(order by )用法,获得了一个通用的分页方案。
如提供了sql如下:
select * from Student where Age>18 order by Age
select *from ( select row_number()over(order by __tc__)__rn__,* from (select top 开始位置+10 0 __tc__,* from Student where Age>18 order by Age)t)ttwhere __rn__>开始位置
select *from (select top 开始位置+10 row_number()over(order by Id)__rn__, * from Student)twhere __rn__>=开始的位置
select *from ( select row_number()over(order by TempColmun) * from ( select top 开始的位置 0 as TempColmun,* from Student order by Id )tt)twhere rowNumber >=开始的位置
--插入测试数据200w条,可能会很久create table Student( Id int PRIMARY KEY identity(1,1), Name nvarchar(50), Age int)insert Student(Name,Age)values('Name',18)while (select count(*) from Student)<2000000 insert Student select Name,Age from Student--开始测试查询declare @now datetime--max方案select 'max'方案select @now=getdate()--beginselect top 10 * from Studentwhere Id>( select max(Id) from ( select top 1999990 Id from Student order by Id)tt)--enddeclare @maxDiff intselect @maxDiff=datediff(ms,@now,getdate())--top方案select 'top'方案select @now=getdate()--beginselect top 10 * from Studentwhere Id not in(select top 1999990 Id from Student)--enddeclare @topDiff intselect @topDiff=datediff(ms,@now,getdate())--row方案select 'row'方案select @now=getdate()--beginselect *from (select row_number()over(order by tc)rn,*from (select top 2000000 0 tc,* from Student)t)ttwhere rn>1999990--enddeclare @rowDiff intselect @rowDiff=datediff(ms,@now,getdate())--row_number方案select 'row_number'方案select @now=getdate()--beginselect *from(select top 2000000 row_number()over(order by Id)rn,* from Student)twhere rn>1999990--enddeclare @row_numberDiff intselect @row_numberDiff=datediff(ms,@now,getdate())--记录结果select '第20万页'页码,@maxDiff max方案,@topDiff top方案,@rowDiff row方案,@row_numberDiff row_number方案
这套方案(下面简称row方案)是本人借鉴Oracle的row_number分页方法和sqlServerrow_number结合+上top分页方案合体版,经过本人初步测试。
效率非常快。(本人测试非常业余,还望高人帮忙测试。)
row方案的具体操作方法在这章帖子里:
一套原创的sqlserver通用分页方案 忘高人测试效率 先阿里嘎多了
比较了3种分页方式,分别是max方案,top方案,row方案
效率:
第1:row
第2:max
第3:top
缺点:
max:必须用户编写复杂Sql,不支持非唯一列排序
top:必须用户编写复杂Sql,不支持复合主键
row:不支持sqlServer2000
测试数据:
共320万条数据,每页显示10条数据,分别测试了2万页、15万页和32万页。
页码,top方案,max方案,row方案
2万,60ms,46ms,33ms
15万,453ms,343ms,310ms
32万,953ms,720ms,686ms
具体操作sql代码如下:
top方案:
select top 10 * from Table1where Id not in(select top 开始的位置 Id from Table1)
select top 10 * from Table1where Id>(select max(Id)from (select top 开始位置 Id from Table1order by Id)tt)
select *from ( select row_number()over(order by tempColumn)tempRowNumber,* from (select top 开始位置+10 tempColumn=0,* from Table1)t)ttwhere tempRowNumber>开始位置
select top 1500010 0 as tempColumn,* from table1 order by column1 desc
[解决办法]
这是你自己创建的么,我也用过这中类似的方法啊,其原理不就是索引么
[解决办法]
http://topic.csdn.net/u/20100608/13/49434117-00f0-4f97-b311-cf96d129d282.html
帮我测试我下 这个 怎么样`
[解决办法]
学习一下...
[解决办法]
看看。。。
[解决办法]
还以为是什么新东西
ROW_NUMBER() ... OVER() 就是SQL Server 2005/2008 的首先翻页方式, LINQ to SQL、ADO.NET Entity Framework 中生成的翻页的ESQL(第一页的除外)全是使用 ROW_NUMBER() ... OVER()
[解决办法]
mark
[解决办法]
厉害哦,学习学习
[解决办法]
学习ing。。。。
[解决办法]
js的