数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

sql存储过程分页算法研究


发布日期:2018年03月01日
 
sql存储过程分页算法研究

“俄罗斯存储过程”的改良版

CREATE procedure pagination(@pagesize int 页面大小如每页存储条记录@pageindex int 当前页码)as set nocount onbegindeclare @indextable table(id int identity()nid int) 定义表变量declare @PageLowerBound int 定义此页的底码declare @PageUpperBound int 定义此页的顶码set @PageLowerBound=(@pageindex)*@pagesizeset @PageUpperBound=@PageLowerBound+@pagesizeset rowcount @PageUpperBoundinsert into @indextable(nid) select gid from TGongwen where fariqi >dateadd(daygetdate()) order by fariqi descselect OgidOmidOtitleOfadanweiOfariqi from TGongwen O@indextable t where Ogid=tnidand tid>@PageLowerBound and tid<=@PageUpperBound order by tidendset nocount off

文章中的点评

以上存储过程运用了SQL SERVER的最新技术――表变量应该说这个存储过程也是一个非常优秀的分页存储过程当然在这个过程中您也可以把其中的表变量写成临时表CREATE TABLE #Temp但很明显在SQL SERVER中用临时表是没有用表变量快的所以笔者刚开始使用这个存储过程时感觉非常的不错速度也比原来的ADO的好但后来我又发现了比此方法更好的方法

从感觉上讲效率不是太高

not in 的方法

从publish 表中取出第 n 条到第 m 条的记录

SELECT TOP mn+ * FROM publish WHERE (id NOT IN (SELECT TOP n id FROM publish))

id 为publish 表的关键字

文章中的点评

我当时看到这篇文章的时候真的是精神为之一振觉得思路非常得好等到后来我在作办公自动化系统(ASPNET+ C#+SQL SERVER)的时候忽然想起了这篇文章我想如果把这个语句改造一下这就可能是一个非常好的分页存储过程于是我就满网上找这篇文章没想到文章还没找到却找到了一篇根据此语句写的一个分页存储过程这个存储过程也是目前较为流行的一种分页存储过程

使用了 not in 而 not in 是无法使用索引的所以从效率上讲还是差了一点

max 的方法

select top 页大小 * from table where id>(select max (id) from(select top ((页码)*页大小) id from table order by id) as T)order by id

文章中的点评

我们知道几乎任何字段我们都可以通过max(字段)或min(字段)来提取某个字段中的最大或最小值所以如果这个字段不重复那么就可以利用这些不重复的字段的max或min作为分水岭使其成为分页算法中分开每页的参照物在这里我们可以用操作符“>”或“<”号来完成这个使命使查询语句符合SARG形式

Select top * from table where id>

这个就高高效了一点但是不清楚 max的工作原理不知道它的性能如何

心得

追求高效的翻页算法 —— 定位法

declare @pageSize int 返回一页的记录数declare @CurPage int 页号(第几页)第一页最后一页declare @Count intdeclare @id intset @pageSize=set @CurPage =定位if @CurPage = begin最后一页set rowcount @pageSizeselect @id=newsID from newsTemp order by newsIDendif @CurPage > beginset @Count = @pageSize * (@CurPage ) + set rowcount @Countselect @id=newsID from newsTemp order by newsID descend

返回记录

set rowcount @pageSizeselect * from newsTemp where newsID <=@id order by newsID descset rowcount

思路就是上面的算法的延续就是说呢避免使用 not in 和 max 的方法也就是这个思路Select top * from table where id>定位 —— 就是说要找到“临界点”分页的临界点找到了之后剩下的事情就好办了

缺点单字段排序排序字段的值不能重复(不是绝对不能重复可以有少量的重复)

通用法 —— 颠颠倒倒法

有的时候“定位法”的缺点是不可以接受的但是没有关系可以用这个的

select * from table where id in(select top ID from(select top IDaddedDate from tableorder by addedDate desc) as aa order by addedDate)order by addedDate desc

ID 是主键addedDate 是排序字段

缺点必须有主键

上一篇:轻松掌握什么是数据的物理(存储)结构

下一篇:利用SQL找出一个月中有多少个周日