请教,为什么要使用分页存储过程,为什么不直接用limit?我看到使用这种技术的大多数是.net程序员 java中这种做法多吗?
下面有一个分页存储过程,如果要对其加入业务逻辑,比如前端有一个按条件搜索的入口,最通用的方法如何做?在这个存储过程上加入一个参数,直接传入一段条件SQL可以吗?
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
goALTER procedure [dbo].[Get_Product]
(@startIndex int,
@endIndex int,
@docount bit)
as
set nocount on
if(@docount=1)
select count(*) AS Counts from Product
else
begin
declare @indextable table(id int identity(1,1),nid int)
set rowcount @endIndex
insert into @indextable(nid) select ID from Product  order by ID desc
select * from Product O,@indextable t where O.ID=t.nid
and t.id between @startIndex and @endIndex order by t.id
end
set nocount off

解决方案 »

  1.   

    这个是SQL SERVER的,SQL SERVER里没有LIMIT,分页比较麻烦。
      

  2.   

    LIMIT 会比较慢。limit 0,100 还可以,MYSQL能取前100条,
    但 limit 10000,100 则比较痛苦,MYSQL还是会取100100 条,然后显示100 条。
      

  3.   

    本帖最后由 yueliangdao0608 于 2010-03-10 17:31:46 编辑
      

  4.   

    没办法的。oracle的rownum也是一样,最后几页跟前几页的提取速度根本没的比。
      

  5.   

    慢这个原因接受不了,没有试验依据,不知道有谁做过 这几种分页销路的对比  1.直接用top 
    2.使用limit
    3.使用存储过程
    还有后面的问题哪位朋友能回答呢?
      

  6.   

    使用存储过程,是出于以下几个方面考量的:
    1,封装的通用性。传进去几个不同的参数,就可以查询不同的结果出来,甚至从不同的表中查询。
    2,复杂的语句写在一个存储过程中,不是很好吗?!
    3,LIMIT使用不当,确实要慢啊。就如2楼所说!
      

  7.   


    第一点,我觉得无通用性可言,一个简单的存储过程怎么可能经得起业务逻辑的折腾,而且你说的传几个参数结果出来,别的方法(sql)一样可以做到
    第二点等于没说分页本来就很简单
    第三点 也白说我现在严重怀疑.net 程序员使用 存储过程进行分页的理论依据,不当的使用存储过程会导致数据库移植,代码可读性,无法群集等诸多问题!我自己还没有做实验,等待大家继续讨论先~
      

  8.   

    mysql官方文档中提到了一些,至于分页为什么要用存储过程?会不会快?我只说下我对oracle使用分页存储过程的理解,mysql的处理机制我不懂,不知道适应不:
    1。一句select提交到数据库后,解析器必须先对sql进行词法、语法分析,这个是需要时间的。
    2。存储过程中即使只有同样的一句select,它只在编译的时候进行一次词法语法分析,所以可以省去词法、语法分析的时间。
    当然在大数据量的情况下,可能相对来说这点分析时间算不了什么咯个人意见,不对拍砖吧。mysql官方文档如下说明:
    MySQL 5.1版支持存储程序和函数。一个存储程序是可以被存储在服务器中的一套SQL语句。一旦它被存储了,客户端不需要再重新发布单独的语句,而是可以引用存储程序来替代。 下面一些情况下存储程序尤其有用: ·         当用不同语言编写多客户应用程序,或多客户应用程序在不同平台上运行且需要执行相同的数据库操作之时。·         安全极为重要之时。比如,银行对所有普通操作使用存储程序。这提供一个坚固而安全的环境,程序可以确保每一个操作都被妥善记入日志。在这样一个设置中,应用程序和用户不可能直接访问数据库表,但是仅可以执行指定的存储程序。 存储程序可以提供改良后的性能,因为只有较少的信息需要在服务器和客户算之间传送。代价是增加数据库服务器系统的负荷,因为更多的工作在服务器这边完成,更少的在客户端(应用程序)那边完成上。如果许多客户端机器(比如网页服务器)只由一个或少数几个数据库服务器提供服务,可以考虑一下存储程序。存储程序也允许你在数据库服务器上有函数库。这是一个被现代应用程序语言共享的特征,它允许这样的内部设计,比如通过使用类。使用这些客户端应用程序语言特征对甚至于数据库使用范围以外的编程人员都有好处。
      

  9.   

    记录在一百万(最好是在八十万)以内时,可以参照http://topic.csdn.net/u/20100201/16/dc9ad7d7-840b-4ded-9d7a-d94db5bc235f.html。如果超过了这个数据,最好只以主键为条件进行分页,如:select SQL_BUFFER_RESULT * 
    from goods g INNER JOIN 
    ( select id as my_id from 
    ( select id from goods 
    order by id desc limit 0,100
    ) as tmp
    ) as temp 
    ON my_id=id注意这个子查询
    select id from goods order by id desc limit 0,100
    不要在这儿用
    select * from goods order by id desc limit 0,100效果仍然请看http://www.dfwgw.com/dGFva2UvbGlzdF9hbGwuaHRtbA==url.html
    目前的数据量显然是没任何问题