求高手写一个分页的查询过程

zjroland 2017-08-11 05:14:01
最近做小程序,要实现下拉刷新,需要用到mssql的分页显示。
小程序传过来的参数有2个:
@pageSize: 一般为每页10个,
@pageNo:,这个是第几页
根据这个写一个存储过程,最好是高效一些的。我也能写,但是效率太低了,记录数一多,比如十几万记录,查询花费的时间就很长。

多谢高手。。。。。
...全文
256 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjroland 2017-08-12
  • 打赏
  • 举报
回复
SELECT PartnerID,FullName, Photo,Style,LEFT(CAST(Brief AS nvarchar(MAX)), 20) AS Brief , ROW_NUMBER() OVER ( ORDER BY CASE WHEN Style = @Style THEN 100000000 ELSE PartnerID END + CASE WHEN Partners_Partners.CityID = @CityID THEN 10000000 ELSE 0 END DESC,PartnerID DESC ) AS RowIndex INTO #tb1_1 FROM Partners_Partners INNER JOIN Accounts_Users ON Accounts_Users.UserID = Partners_Partners.UserID WHERE Visible=1 SELECT PartnerID,FullName, Photo,Style,LEFT(CAST(Brief AS nvarchar(MAX)), 20) AS Brief INTO #tb1_2 FROM #tb1_1 AS t WHERE t.RowIndex > ( @pageNo - 1 ) * @PageSize AND t.RowIndex <= @pageNo * @PageSize; 以上的写法没有显示错误, 就是这里从下面开始不知道怎么写: SELECT * FROM tablename WHERE a.Identifier IN ( SELECT * FROM #tb1_2 ) ORDER BY Identifier DESC; DROP TABLE #tb1_1; DROP TABLE #tb1_2;
zjroland 2017-08-12
  • 打赏
  • 举报
回复
引用
SELECT Identifier , ROW_NUMBER() OVER ( ORDER BY Identifier DESC ) AS RowIndex INTO #tb1_1 FROM tablename WHERE name LIKE '%张%'; --这里写条件 SELECT Identifier INTO #tb1_2 FROM #tb1_1 AS t WHERE t.RowIndex > ( @pageNo - 1 ) * @PageSize AND t.RowIndex <= @pageNo * @PageSize; SELECT * FROM tablename WHERE a.Identifier IN ( SELECT * FROM #tb1_2 ) ORDER BY Identifier DESC; DROP TABLE #tb1_1; DROP TABLE #tb1_2;
还是采用这个好,但是我原来的查询比较复杂,是: ALTER PROCEDURE [dbo].[up_Partners_GetPartnerList] @CityID int, @Style nvarchar(50) AS SELECT PartnerID,FullName, Photo,Style,LEFT(CAST(Brief AS nvarchar(MAX)), 20) AS Brief FROM Partners_Partners INNER JOIN Accounts_Users ON Accounts_Users.UserID = Partners_Partners.UserID WHERE Visible=1 ORDER BY CASE WHEN Style = @Style THEN 100000000 ELSE PartnerID END + CASE WHEN Partners_Partners.CityID = @CityID THEN 10000000 ELSE 0 END DESC,PartnerID DESC 不知道如何改写成分页的存储过程。。。。
zjroland 2017-08-12
  • 打赏
  • 举报
回复
多谢sinat_28984567!
二月十六 版主 2017-08-12
  • 打赏
  • 举报
回复
zjroland 2017-08-12
  • 打赏
  • 举报
回复
offset的具体写法是?
二月十六 版主 2017-08-12
  • 打赏
  • 举报
回复
引用 4 楼 zjroland 的回复:
在sqlserver2005之前一直借助top关键字来实现分页查询,不过效率低,在sqlserver2005及其之后的版本都使用row_number()解析函数来完成分页查询,效率有了很大的提高,不过sql语句比较复杂。
如果是2012之后的可以用offset
zjroland 2017-08-12
  • 打赏
  • 举报
回复
在sqlserver2005之前一直借助top关键字来实现分页查询,不过效率低,在sqlserver2005及其之后的版本都使用row_number()解析函数来完成分页查询,效率有了很大的提高,不过sql语句比较复杂。
zjroland 2017-08-12
  • 打赏
  • 举报
回复
我试一下 sinat_28984567 的,如果还有其他的存储过程写法,也欢迎大家交流一下。。。。
二月十六 版主 2017-08-11
  • 打赏
  • 举报
回复
如果是2012之前的版本用rownumber来做,大概这样:
 SELECT Identifier ,
        ROW_NUMBER() OVER ( ORDER BY Identifier DESC ) AS RowIndex
 INTO   #tb1_1
 FROM   tablename
 WHERE  name LIKE '%张%'; --这里写条件


 SELECT Identifier
 INTO   #tb1_2
 FROM   #tb1_1 AS t
 WHERE  t.RowIndex > ( @pageNo - 1 ) * @PageSize
        AND t.RowIndex <= @pageNo * @PageSize;

 SELECT *
 FROM   tablename
 WHERE  a.Identifier IN ( SELECT    *
                          FROM      #tb1_2 )
 ORDER BY Identifier DESC;

 DROP TABLE #tb1_1; 
 DROP TABLE #tb1_2;
吉普赛的歌 版主 2017-08-11
  • 打赏
  • 举报
回复
分页的效率不仅跟写法有关, 还跟索引有关, 在这个问题上没有一劳永逸的办法, 要不这个论坛都可关了。 只能具体事情具体分析。 你把慢的SQL拿出来, 大家帮你分析就是了。 看是改写法, 还是加索引什么的
在网上找了一个 Asp数据操作组件(百万级分页) ,实用环境:Asp+DLL+MsSQL(这个网上很多地方都可以下载),并且其中结合SQL存储过程,说实话以前SQL存储过程接触的比较少,所以在调试该组件的时候遇到了一些问题,并试着改了一下(作者别生气(^..^)),高手们别笑话我。 原代码如下: 有分页列表数据: cls.tblName="Tablename" '表名 cls.fldName="Id" '排序关键字段 cls.PageIndex=Request("P")*1 '当前页码 cls.PageSize=20 '每页列数 cls.OrderType=1 '排序方式,0 、1 cls.strWhere=StrW '查询条件,不带Where cls.ListUrl="?Y="&Y&"&M="&M&"&D="&D&"&Sn="&Sn&"&P=" 分页URL Set Rs=cls.Result do while not rs.eof rs.movenext loop 分页数据 cls.page 在原文的使用说明中,在翻页代码中对表查询默认是全部字段也就是*,这样是不是会浪费资源,而无法查询需要的字段,于是我在DLL代码中新加入一个变量名为zdName,作为传递可控制查询条件的变量,同时在SQL存储过程中也加入相应的接受变量@zdName 字符型。 在这个小问题解决后,又在使用上发现cls.strWhere付给它的变量StrW 如果条件变量其中带有类似 例如 a='b'则执行SQL存储过程时候会提示错误,后来发现是DLL代码中: sql = "exec GetList " & tblName & "," & fldName & "," & PageSize & "," & PageIndex & "," & OrderType & ",'" & strWhere & "' " 这个地方是否写的不够严谨,在StrW中如果含有单引,那么将无法执行,所以我在DLL的VB代码改成 If InStr(strWhere, "'") 0 Then sql = "exec GetList " & tblName & "," & fldName & "," & PageSize & "," & PageIndex & "," & OrderType & ",""" & strWhere & """ " Else sql = "exec GetList " & tblName & "," & fldName & "," & PageSize & "," & PageIndex & "," & OrderType & ",'" & strWhere & "' " End If 试了试目前的问题确实解决了,这个组件我也是刚刚使用,希望对大家能有点帮助!

34,874

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧