【问题标题】:paging in ms sqlms sql 中的分页
【发布时间】:2013-04-10 19:22:30
【问题描述】:

我有这个代码

ALTER PROCEDURE [dbo].[Model_Core_BlogPost_GetLatestPaging] 
@PageSize INT,
@CurrentPage INT
AS
BEGIN

DECLARE @PageStart int, @PageEnd int
SET @PageStart = @CurrentPage * @PageSize
set @PageEnd = @PageStart + @PageSize

;with C as (

SELECT
e.blogpostid, 
e.PreviewText, 
e.Headline, 
e.URLHeadline, 
u.Blogname, 
u.imageurl AS ImageURL, 
e.CommentsCount, 
e.HitsCount, 
e.Created, 
ROW_NUMBER() over (order by e.created desc) as rownum

FROM BlogPosts e
INNER JOIN Users u ON e.BlogUserID = u.UserID
WHERE e.[Status] = 1 and e.Deleteddate is null
)

SELECT *
FROM C
WHERE rownum > @pagestart
AND rownum <= @pageend

END

当@CurrentPage 很大时我会遇到问题,并且我的应用程序中经常出现 sql 超时。

有什么解决方案的想法吗?

【问题讨论】:

  • 请发布您的执行计划
  • 您能否提供与博客帖子和用户相关的任何内容的架构信息?我猜你可以添加一个索引来帮忙。
  • 我已经在 where 子句中添加了索引。当页面数量较多时,开发另一个SP来运行会更好吗?

标签: sql-server tsql paging


【解决方案1】:

只要索引到位,我建议将此查询拆分为 2 个单独的查询。

首先运行排名功能并过滤博客文章,将结果插入临时表,然后可能通过使用选项循环连接将临时表与用户连接(与用户和循环连接相比,临时表的行数很少非常适合这种情况)。

这样,您的连接将有更少的行来解析。另外,你确定 blogposts.created 列有索引吗? Row_number 将对该字段进行排序。

【讨论】:

  • 我认为临时表有点慢...我仔细检查了我在创建的列上有一个索引。
  • 这取决于...。在这种特定情况下,它应该会快得多,特别是如果您设法向其中添加索引。它将只有当前页面的行,我认为如果您只加入那几行,您将获得显着的性能。您可以为此使用 cte,但我不信任他们,在这种特定情况下您不会有所收获。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
相关资源
最近更新 更多