set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
--以下是查询二级下面的所有文章
ALTER proc [dbo].[Article_GetByTypeID]
(
@startindex int,
@pagesize int,
@TypeID int,
@ImgType int
)
as
begin
if(@ImgType=0)
select top(@pagesize) * from Article_View where ArticleType_ID=@TypeID or AT_ParID=@TypeID and A_ID NOT IN
(
select top(@pagesize*@startindex) A_ID from Article where ArticleType_ID=@TypeID or AT_ParID=@TypeID order by A_Order desc,A_InTime desc
) order by A_Order desc,A_InTime desc
else if(@ImgType=1)
select top(@pagesize) * from Article_View where (ArticleType_ID=@TypeID or AT_ParID=@TypeID) and A_Img='' and A_ID NOT IN
(
select top(@pagesize*@startindex) A_ID from Article where (ArticleType_ID=@TypeID or AT_ParID=@TypeID) and A_Img='' order by A_Order desc,A_InTime desc
) order by A_Order desc,A_InTime desc
else if(@ImgType=2)
select top(@pagesize) * from Article_View where (ArticleType_ID=@TypeID or AT_ParID=@TypeID) and A_Img<>'' and A_ID NOT IN
(
select top(@pagesize*@startindex) A_ID from Article where (ArticleType_ID=@TypeID or AT_ParID=@TypeID) and A_Img<>'' order by A_Order desc,A_InTime desc
) order by A_Order desc,A_InTime desc
end上面是我一个查询数据的存储过程,为毛我的页面读取的很慢很慢,我一页显示十条,每次页面加载的时候要停几秒才加载IE进度条,是SQL效率问题吗?

解决方案 »

  1.   

    你的数据库是SQL SERVER 2000吗? SQL SERVER 2005和2008多用row_number() 进行分页。
      

  2.   

    row_number() 和 双top倒腾法,效率到底哪个高?
      

  3.   


    我用的是sql2005请问下请求开始IE没反应四五秒,然后才加载进行度条,是这个原因吗?
      

  4.   

    这个不一定,你要测试一下你的存储过程执行用了多长时间。
    检查出IE没反应四五秒的真正原因,是连接数据库的问题,还是取数据的问题,还是你在pageload中有其他操作延迟了页面加载。或者页面上onload()事件里面有耗时的操作。加载大量的js也是导致页面空白。
      

  5.   

    这个不是绝对的,2005出的row_number,但是数据量小的时候top的测试结果有的时候反而更好一些。
    但是整体来讲,我觉得还是row_number比较方便,而且在大多数情况下是优于双top的。SQL SERVER 2012出现了OFFSET/FETCH NEXT分页,比row_number要好很多。
      

  6.   


    OFFSET/FETCH NEXT分页,和row_number应该都是一样的吧
    都像mysql很早就有的 limit n,m,就是对结果集增加一个序号列,再按此列选记录:m开始的前n行
      

  7.   

    我觉得理论上也是差不多的,而且确实和Mysql的limit很像。
    效率上确实有提升,参考:
    http://beyondrelational.com/modules/29/presentations/483/scripts/12983/sql-server-2012-server-side-paging-demo-using-offsetfetch-next.aspx?utm_source=brnewsletter&utm_medium=email&utm_campaign=2012Apr