0

我有这个代码

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 超时时,我会遇到问题。

任何解决方案的想法?

4

1 回答 1

0

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

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

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

于 2013-04-12T05:14:58.113 回答