以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
分页控件使用方法
最新推荐文章于 2024-10-31 16:16:13 发布