簡體   English   中英

優化嵌套查詢以加入

[英]Optimizing nested query to JOIN

我在下面的查詢中返回了countfunction -

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM