首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 数据库 第二书店 程序员

分页控件之分页算法 —— for SQL Server 版。百万级的数据只需要15毫秒到900毫秒


下载分页控件(包括源码和演示)

分页控件使用方法

关于分页的误区
误区1:分页的时候,只有使用存储过程,效率才高。
误区2:忽略了索引的作用。

上两篇好像介绍的不太详细,这里详细说明一下分页控件里使用的分页算法,也就是SQL语句。

分页一般分为四种情况

1、单字段排序,排序字段没有重复值。
2、单字段排序,排序字段有重复值。
3、多字段排序,最后一个排序字段没有重复值。
4、多字段排序,最后一个排序字段有重复值。

其中第2、4 情况都可以再加一个排序字段(比如说主键),就可以转换成第三种情况。

所以分页针对1、3两种情况设置了两种分页算法。

1、单字段排序,排序字段没有重复值。

公式:

1declare @col int
2
3select top {PageSize * (PageIndex-1)+1} @col = [排序字段]
4from [表名 ¦视图名]
5[ where 查询条件 ]
6order by [排序字段] asc ¦desc
7
8select top PageSize 需要显示的字段
9from [表名 ¦视图名]
10where [排序字段] >= @col
11[ and 查询条件 ]
12order by [排序字段] asc ¦desc
以NorthWind 数据库里的 Products 表为例,假设一页显示10条数据,CategoryID = 3 为查询条件,按照ProductID 倒序,如果想显示第二页的数据,那么SQL语句就是
declare @col int

select top 11 @col = ProductID from Products where CategoryID = 3 order by ProductID desc

select top 10 * from Products where ProductID >= @col and CategoryID = 3 order by ProductID desc
说明:
第一行的定义,要根据字段类型来修改,看是比较麻烦,但是这个麻烦交给分页控件就可以了,使用者,只要设置分页控件的属性就可以了。
第五行和第十一行,如果需要加查询条件的话就可以在这里添加。

第三行是一个“定位”,这个可以算是SQL Server 所特有的吧,也是SQL Server 很宽容的地方。以Products 表的例子,执行完第一条select 语句之后, @col 里面记录的是 在CategoryID = 3 的记录里面,按照ProductID 倒序,排行在11位的记录的值。

第一个select 语句定位以后,第二个select 语句就可以根据这个“位置”继续向下查找数据了。

虽然例子里面使用了ProductID(主键)来排序,但是并不是说这个算法只能用主键来排序,哪个字段都可以,但是要符合第一种情况,就是“只有一个排序字段,且排序字段里的记录没有重复值”!


3、多字段排序,最后一个排序字段没有重复值。

如果 Products 表想要用 UnitPrice 字段来排序怎么办呢?上面的算法是不适合的,我们需要使用另一种算法,这个和颠颠倒倒法有些类似,但是我做了一些优化。

公式:
select [需要显示的字段] from [表名 ¦视图名] where [主键字段] in

( select top PageSize [主键字段] from
(select top {PageSize * PageIndex} [主键字段] , [排序字段] from --有几个排序字段就写几个字段

[表名 ¦视图名]
[ where 查询条件 ]
order by

[排序字段1] asc ¦desc ,
[排序字段2] desc ¦asc,

[主键字段] asc ¦desc
) as aa
order by
[排序字段1] desc ¦asc, --如果上面是倒序,那么这里就是正序,下同
[排序字段2] asc ¦desc ,

[主键字段] desc ¦asc

)

order by
[排序字段1] asc ¦desc, --如果上面是倒序,那么这里就是正序,所谓颠颠倒倒嘛。
[排序字段2] desc ¦asc,

[主键字段] asc ¦desc
以NorthWind 数据库里的 Products 表为例,假设一页显示10条数据,CategoryID = 3 为查询条件,按照UnitPrice 倒序,由于UnitPrice 字段可能有重复值,所以加上一个排序字段——ProductID ,即按照 UnitPrice desc,ProductID 来排序。 如果想显示第二页的数据,那么SQL语句就是
select * from Products where ProductID in
( select top 10 ProductID from
(select top 20 ProductID , UnitPrice from
Products
where CategoryID = 3
order by
UnitPrice desc ,
ProductID
) as aa
order by
UnitPrice asc, --如果上面是倒序,那么这里就是正序,下同
ProductID desc
)
order by
UnitPrice desc, --如果上面是倒序,那么这里就是正序,所谓颠颠倒倒嘛。
ProductID
说明:
1、这里查询条件加一次就可以了。
2、是不是看 asc ¦desc 倒来倒去的有点晕,恩,这就对了,颠颠倒倒嘛。
3、最主要的就是第三个select 语句,他要取从第一条数据到要显示的页的数据,可见越是后面的记录,top n 就会越大,所以这里提取的数据就要做一个精简,只写排序需要的字段(主键字段和排序字段)。
4、第二个select 语句是去掉前面不需要的页里的数据,只保留要显示的页号里的数据。
5、第一个select 语句,用主键字段 in () 的方式提取其他需要的字段。
6、这种分页算法有一个小的bug,就是显示最后一页数据的时候,会多出来几条记录,不过这个bug已经在分页控件里面修正了,最后一页的分页算法,采用特殊的select语句。
7、效率,设置好索引,效率是没有问题的,上一篇随笔已经测试过了。
8、这种算法有一个“侵入性”,就是要求表必须有主键,而且不能是联合主键,引为要用 in 的方式查询数据。但是并没有要求主键自身必须能够排序。

测试效果
记录数:2523136条。
一页显示5条记录。


//分页算法1 单字段排序,且排序字段是聚集索引。
//1000 页以内 15毫秒
//10000页以内 30毫秒
//50000页以内 100多毫秒
//100000页以内 200多毫秒
//最后几页 第一次跳转到 4秒多
//最后几页 连续向前翻页 1秒156毫秒

//页号大范围跳转的时候需要的时间比较长,但是也小于1秒,同时SQL Server 占用的内存有所增加 120M。最后几页时达到320M

===================================================================
以下是多排序字段的分页情况,排序字段是 UnitPrice,ProductID

//分页算法2 无索引 首页 8秒187毫秒 。
//10 页以内 2秒812毫秒
//速度太慢下面的就不测试了

//分页2 非聚集索引 UnitPrice 首页 468毫秒
//10 页以内 2秒671毫秒
//速度太慢下面的就不测试了


//分页算法2 非聚集索引 UnitPrice,ProductID 首页 500毫秒
//10 页以内 2秒796毫秒
//100页以内 4秒796毫秒
//速度太慢下面的就不测试了


//分页算法2 非聚集索引 UnitPrice,ProductID desc 首页 500毫秒
//10 页以内 0-15毫秒
//100页以内 15-46毫秒
//1000页以内 31-62毫秒
//10000页以内 100毫秒左右
//50000页以内 400-500毫秒
//100000页以内 900毫秒左右
//最后几页 第一次跳转到 4秒421毫秒
//最后几页 连续向前翻页 4秒375毫秒

//页号大范围跳转的时候需要的时间比较长,但是也小于1秒,
//这回SQL Server 占用的内存增加幅度不大 120M左右



他们设置了哪些标签:


—— .net .net应用 01-01-010 asp.net Database fneye for Server SQL sql_分页控件之分页算法 SQL百万计语句分页方法 SQL分页空件和算法 t 百万级的数据 百万级分页算法 版。百万级的数据只需要15毫秒到900毫秒 分页 分页控件 分页控件之分页算法 分页算法 高效率分页~ 含两分页办法 技术 控件 数据库 数据库应用 数据库优化 网摘杂烩

谁收藏了这个网址:


kongwei521收录

时间:2008-5-7 23:22:55 | 相关网摘

ysn1314收录

时间:2008-5-8 8:01:10 | 相关网摘

页的时

ra2_fang收录

时间:2008-5-8 8:44:44 | 相关网摘

以分页针对1、3两种情况设置了两种分页算

paulyjin收录

时间:2008-5-8 15:53:52 | 相关网摘

GengWH收录

时间:2008-5-8 16:01:47 | 相关网摘

jiangli19192收录

时间:2008-5-8 17:05:05 | 相关网摘

xy_wolf收录

时间:2008-5-8 17:16:46 | 相关网摘

分页

ading10收录

时间:2008-5-8 17:23:45 | 相关网摘

aini3345365收录

使用标签:sql,时间:2008-5-8 17:28:25 | 相关网摘

分页控件之分页算法

jotn26收录

使用标签:分页,时间:2008-5-8 18:46:25 | 相关网摘

paolei收录

使用标签:.net,时间:2008-5-9 11:02:02 | 相关网摘

分页

AndaChang收录

时间:2008-5-9 13:42:16 | 相关网摘

tautaulee收录

时间:2008-5-10 9:38:40 | 相关网摘

charry0110收录

时间:2008-5-10 15:41:24 | 相关网摘

kissweb收录

使用标签:SQL百万计语句分页方法,时间:2008-6-1 12:20:12 | 相关网摘

分页控件之分页算法 —— for SQL Server 版。百万级的数据只需要15毫秒到900毫秒

hzysoft收录

时间:2008-6-2 9:44:03 | 相关网摘

cww2010收录

时间:2008-6-2 15:22:32 | 相关网摘

stoneoil收录

时间:2008-6-4 15:19:08 | 相关网摘

showbo收录

时间:2008-6-5 16:13:49 | 相关网摘

时表或者表变量

geto1080收录

时间:2008-6-5 17:05:32 | 相关网摘

airport0928收录

时间:2008-6-5 17:17:20 | 相关网摘

only_endure收录

使用标签:.net应用,时间:2008-6-5 19:39:42 | 相关网摘

xie_yanke收录

时间:2008-6-5 19:56:59 | 相关网摘

zwb521收录

使用标签:分页,时间:2008-6-5 19:59:47 | 相关网摘

skyfly770收录

时间:2008-6-5 20:57:08 | 相关网摘

吴旗娃得分页控件生成的分页算法

yuji821收录

时间:2008-6-5 21:11:32 | 相关网摘

birdWing收录

使用标签:百万级分页算法,时间:2008-6-6 9:40:29 | 相关网摘

guanxiansun2004收录

时间:2008-6-6 9:58:50 | 相关网摘

diablososi收录

时间:2008-6-6 11:01:41 | 相关网摘

wang520d收录

使用标签:分页,时间:2008-6-6 11:34:29 | 相关网摘

sxmonsy收录

时间:2008-6-6 14:05:19 | 相关网摘

shoushii收录

时间:2008-6-6 14:14:00 | 相关网摘

wuxinyuyun收录

时间:2008-6-6 14:41:47 | 相关网摘

vargaszj收录

使用标签:SQL分页空件和算法,时间:2008-6-6 14:51:47 | 相关网摘

Night_Elf收录

时间:2008-6-6 15:38:50 | 相关网摘

afei2121收录

时间:2008-6-6 15:43:06 | 相关网摘

junzhang4008收录

时间:2008-6-6 16:46:29 | 相关网摘

fanlong收录

时间:2008-6-6 17:01:14 | 相关网摘

scz26收录

使用标签:.NET,时间:2008-6-6 17:20:11 | 相关网摘

mike1lainet收录

时间:2008-6-6 17:53:47 | 相关网摘

senyo收录

使用标签:sql, server,时间:2008-6-6 19:21:56 | 相关网摘

kenth收录

时间:2008-6-7 8:36:17 | 相关网摘

foreverlovezyn收录

时间:2008-6-7 11:30:19 | 相关网摘

me_try收录

时间:2008-6-7 13:09:33 | 相关网摘

largedatabase收录

时间:2008-6-7 15:04:59 | 相关网摘

7cai收录

时间:2008-6-7 15:24:43 | 相关网摘

qq663695753收录

时间:2008-6-7 20:06:21 | 相关网摘

sql分页

shadowjl收录

时间:2008-6-7 22:52:23 | 相关网摘

qstaylove收录

时间:2008-6-7 23:50:49 | 相关网摘

是建立索引 的话 就不同了 我还没正式测试过.

kkk11621318收录

时间:2008-6-8 10:47:30 | 相关网摘

levingston收录

时间:2008-6-8 23:07:56 | 相关网摘

分页算法

sh_suyuelin收录

时间:2008-6-10 9:36:34 | 相关网摘

guarduo收录

使用标签:高效率分页~,时间:2008-6-10 9:41:20 | 相关网摘

chsteven收录

时间:2008-6-10 10:03:39 | 相关网摘

lovehongyun收录

时间:2008-6-10 10:35:47 | 相关网摘

myzhangjia收录

时间:2008-6-10 10:44:50 | 相关网摘

ffeeffee收录

使用标签:数据库,时间:2008-6-10 11:09:35 | 相关网摘

ffanpeng收录

时间:2008-6-10 11:14:45 | 相关网摘

satans18收录

时间:2008-6-10 11:55:47 | 相关网摘

jinquan_xu收录

时间:2008-6-10 13:39:09 | 相关网摘

lwlivy收录

时间:2008-6-10 13:45:06 | 相关网摘

herowzz收录

时间:2008-6-10 14:02:40 | 相关网摘

wangping_li收录

时间:2008-6-10 14:20:02 | 相关网摘

loveunh1982收录

时间:2008-6-10 14:20:36 | 相关网摘

hzzz_lgh3399收录

时间:2008-6-10 14:42:05 | 相关网摘

fuda_1985收录

时间:2008-6-10 14:51:40 | 相关网摘

fuanyu123收录

时间:2008-6-10 15:04:33 | 相关网摘

Janyue收录

时间:2008-6-10 16:40:56 | 相关网摘

mylibin收录

时间:2008-6-10 17:47:43 | 相关网摘

cxr5201314收录

时间:2008-6-10 19:45:45 | 相关网摘

liuyuan0535收录

时间:2008-6-10 19:54:00 | 相关网摘

llyzq收录

时间:2008-6-10 19:58:19 | 相关网摘

kawensong收录

时间:2008-6-10 20:04:47 | 相关网摘

xiaojian收录

时间:2008-6-10 21:23:19 | 相关网摘

lion533335收录

时间:2008-6-10 22:40:56 | 相关网摘

redleaf1995收录

时间:2008-6-10 22:59:53 | 相关网摘

okook收录

时间:2008-6-10 23:53:23 | 相关网摘

zym369012收录

使用标签:分页,时间:2008-6-11 8:56:23 | 相关网摘

分页

BlueSunny收录

时间:2008-6-11 9:12:19 | 相关网摘

kevinlui2008收录

时间:2008-6-11 9:14:23 | 相关网摘

sunjiahaoz收录

时间:2008-6-11 9:26:04 | 相关网摘

blackhero收录

时间:2008-6-11 9:27:21 | 相关网摘

nicejane收录

时间:2008-6-11 9:28:04 | 相关网摘

vriuswgq收录

使用标签:database,时间:2008-6-11 10:43:40 | 相关网摘

banditi225收录

时间:2008-6-11 11:05:33 | 相关网摘

ud_miser收录

时间:2008-6-11 11:35:08 | 相关网摘

qiqi13733801551收录

时间:2008-6-11 11:38:55 | 相关网摘

LifeForCode收录

使用标签:分页,时间:2008-6-11 12:30:45 | 相关网摘

suzhu2500084收录

时间:2008-6-11 12:33:01 | 相关网摘

fengsky491收录

时间:2008-6-11 13:01:14 | 相关网摘

fjicefire收录

时间:2008-6-11 13:09:01 | 相关网摘

blue_maple收录

时间:2008-6-11 13:59:41 | 相关网摘

SQL Server 分页

zmm12收录

时间:2008-6-11 14:17:29 | 相关网摘

Neoman收录

时间:2008-6-11 14:44:07 | 相关网摘

w1kings收录

时间:2008-6-11 14:50:16 | 相关网摘

ShunYea收录

时间:2008-6-11 15:04:26 | 相关网摘

luochangcheng收录

使用标签:分页控件, SQL, Server,时间:2008-6-11 16:17:20 | 相关网摘

qyhxx收录

时间:2008-6-11 16:25:22 | 相关网摘

dwm250收录

时间:2008-6-11 16:39:18 | 相关网摘

benbenkui收录

时间:2008-6-11 16:50:37 | 相关网摘


网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
Copyright © 2000-2008, CSDN.NET, All Rights Reserved