您现在的位置是:首页 >

sql带参数存储过程 sql存储过程分页算法研究

火烧 2022-11-02 03:20:50 1055
ql存储过程分页算法研究    “俄罗斯存储过程”的改良版  CREATE rocedure agi atio @ age ize i t 页面大小 如每页存储 条记录 @ agei dex i t

sql存储过程分页算法研究  

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

  CREATE procedure pagination (@pagesize int 页面大小 如每页存储 条记录 @pageindex int 当前页码) as set nocount on begin declare @indextable table(id int identity( ) nid int) 定义表变量 declare @PageLowerBound int 定义此页的底码 declare @PageUpperBound int 定义此页的顶码 set @PageLowerBound=(@pageindex )*@pagesize set @PageUpperBound=@PageLowerBound+@pagesize set rowcount @PageUpperBound insert into @indextable(nid) select gid from TGongwen where fariqi >dateadd(day getdate()) order by fariqi desc select O gid O mid O title O fadanwei O fariqi from TGongwen O @indextable t where O gid=t nid and t id>@PageLowerBound and t id<=@PageUpperBound order by t id end set nocount off

  文章中的点评

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

  从感觉上讲 效率不是太高

   not in 的方法

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

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

  id 为publish 表的关键字

  文章中的点评

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

sql带参数存储过程 sql存储过程分页算法研究

  使用了 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 int declare @id int set @pageSize= set @CurPage = 定位 if @CurPage = begin 最后一页 set rowcount @pageSize select @id=newsID from newsTemp order by newsID end if @CurPage > begin set @Count = @pageSize * (@CurPage ) + set rowcount @Count select @id=newsID from newsTemp order by newsID desc end

   返回记录

  set rowcount @pageSize select * 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 ID addedDate from table order by addedDate desc ) as aa order by addedDate ) order by addedDate desc

  ID 是主键 addedDate 是排序字段

lishixinzhi/Article/program/SQL/201405/30846  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码