2013-04-10 197 views
0

我有這樣的代碼尋呼MS SQL

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超時。

解決方案的任何想法?

+1

請發佈您的執行計劃 – 2013-04-10 19:24:50

+0

您能否提供與BlogPosts和用戶相關的任何模式信息?我的猜測是你可以添加一個索引來幫忙。 – 2013-04-10 19:32:02

+0

我已經在where子句中添加了索引。當頁面數量很大時,開發另一個SP是否更好? – user1914109 2013-04-11 06:25:36

回答

0

只要索引就位,我建議將這個查詢拆分爲兩個單獨的。

首先運行排名功能並在blogpost上過濾,將結果插入到臨時表中,然後通過使用選項循環聯接將臨時表與用戶連接起來(臨時表的行數與用戶數和循環數加入是完美的這種情況)。

這樣你的聯接將有更少的行解析。另外,你確定blogposts.created列有索引嗎? Row_number將執行此字段的排序。

+0

我認爲臨時表有點慢...我仔細檢查過,我在創建的列上有一個索引。 – user1914109 2013-04-12 06:31:01

+0

這取決於....在這種特定情況下,它應該快得多,特別是如果你管理添加索引到它。它只有當前頁面的行,我認爲如果只加入那幾行,你將獲得顯着的性能。你可以用cte來做這件事,但我不相信他們,在這種特殊情況下你不會獲得什麼。 – 2013-04-12 13:59:25