[英]Optimizing nested query to JOIN
我在下面的查詢中返回了count
的function
-
SELECT @CommentCount = COUNT(1)
FROM cs_posts
WHERE PostLevel IN (2,3) AND IsApproved=1 AND ThreadId=(SELECT ThreadId FROM Cs_Posts WHERE PostId=@PostID)
RETURN @CommentCount
為了improve the performance
我需要對此進行optimize
。
此外,我function in SP
使用了此function in SP
,該功能被稱為36
次[見下文]-
INSERT INTO @TempPostIds (RowID,PostID)
SELECT TOP 36
ROW_NUMBER() OVER(ORDER BY CASE
WHEN @sortBy ='comments' THEN ISNULL(dbo.GetCommentCountForPost(CP.PostID),0) END DESC, <---here the function is called
CASE WHEN @sortBy = 'views' THEN IsNull(MAVC.ViewCount,CP.TotalViews) END DESC,
CASE WHEN @sortBy='date' THEN CP.PostDate END DESC),
CP.PostID
from CS_Posts as CP with (nolock)
inner join NewsletterDetails AD (nolock ) on CP.PostID = AD.PostID
Inner Join cs_Threads CT (NOLOCK) on CP.ThreadID = CT.ThreadID
Inner Join MapNewsletterPosts MM (NOLOCK)on MM.PostID = AD.PostId
Inner Join NewsLetter NW (NOLOCK) ON NW.ID = MM.ID
LEFT OUTER JOIN PostViewCount MAVC (NOLOCK) ON CP.PostID = MAVC.PostID
WHERE
CP.isapproved =1
AND CP.PostStatus = 7
AND CP.SectionID in(95,199)
AND AD.IncludeInArticles=1
AND AD.NewsletterDate <= DATEADD(day,-7, GETDATE())
請幫助和建議。
不知道我是否正確理解了您的功能(尤其是沒有表結構),但是我相信不需要嵌套查詢:
SELECT @CommentCount = COUNT(1)
FROM cs_posts
WHERE PostLevel IN (2,3) AND IsApproved=1 AND PostId=@PostID
RETURN @CommentCount
祝好運!
這回答了問題的原始版本。
對於此查詢:
SELECT @CommentCount = COUNT(1)
FROM cs_posts
WHERE PostLevel IN (2, 3) AND
IsApproved = 1 AND
ThreadId = (SELECT p2.ThreadId FROM Cs_Posts p2 WHERE p2.PostId = @PostID);
您想要在cs_posts(PostId, ThreadId)
和cs_posts(IsApproved, PostLevel, ThreadId)
上cs_posts(PostId, ThreadId)
索引。
不要使用標量函數,而要使用TVF:
CREATE FUNCTION dbo.GetCommentCountForPost_tvf (@PostID int) RETURNS TABLE
AS RETURN
SELECT COUNT(*) AS CommentCount
FROM cs_posts c
WHERE c.PostLevel IN (2,3)
AND c.IsApproved = 1
AND EXISTS (SELECT 1 FROM Cs_Posts e WHERE e.PostId = @PostID AND e.ThreadId = c.ThreadId);
然后,在您的SELECT
ISNULL(dbo.GetCommentCountForPost(CP.PostID),0)
更改為ISNULL(GCC.CommentCount,0)
並將以下內容添加到FROM
:
CROSS APPLY dbo.GetCommentCountForPost_tvf(CP.PostID) GCC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.