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

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

多谢高手。。。。。
...全文
215 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拿出来, 大家帮你分析就是了。 看是改写法, 还是加索引什么的

34,593

社区成员

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

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