知识大全 sql存储过程分页算法研究
Posted 知
篇首语:只有知道如何停止的人才知道如何加快速度。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 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)的时候 忽然想起了这篇文章 我想如果把这个语句改造一下 这就可能是一个非常好的分页存储过程于是我就满网上找这篇文章 没想到 文章还没找到 却找到了一篇根据此语句写的一个分页存储过程 这个存储过程也是目前较为流行的一种分页存储过程
使用了 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 是排序字段
cha138/Article/program/SQL/201405/30846相关参考
CREATEPROCmyx_prPageRecordset @queryStrnvarchar() @keyFieldnvarc
SQL大数据量分页存储过程效率测试 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! /*存储过程分
SQLServer千万数量级分页存储过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 随着信息
项目接近尾声了感觉将业务逻辑放到oracle中使得后台代码很精简oracle很有搞头! PL\\SQL: createorreplaceprocedureproc_client_List客户多
oracle存储过程分页代码是怎么实现的我们来看下实验小编为您整理的方法吧! /*******存储过程分页代码**********/ 包头 createorreplacepackagepck
分页SQLServer存储过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! /*用存储过程实现
在看了众多的分页存储过程以后发现都是针对sqlserver的而没有oracle的因此想写一个关于oracle的存储过程因为我用到的数据库是oracleoracle分页存储过程的思路于sqlserv
createorreplacepackagemypack as typecursortestCursorisrefcursor; endmypack; tableName表名pageSiz
ASP.NET利用存储过程实现分页 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 首先说下思路写
ASP.NET存储过程自定义分页详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n