2012-03-22 2 views
1

내 게시물과 내 의견을 모두 포함하는 테이블이 있습니다. 우리는 하나의 코멘트만을 깊이 간직하고, 코멘트에 대해서는 코멘트가 없습니다. 지금 당장은 게시물에 대한 ajax 요청을 수행하고 다른 쿼리에서 주석을 가져온 후 상위 게시물 ID를 사용하여 적절한 하위 주석을 가져옵니다.SQL Server 2008 스레드 주석 시스템 - 더 효율적인 것은 무엇입니까?

내가 원하는 것은 이것을 가장 효율적인 단일 쿼리 시스템으로 통합하는 것입니다.

이 내가 틀리지 않는 경우, CROSS APPLY를 사용하거나 UNION 하나에 나를 잎,하지만 몇 가지주의 사항이 있습니다 :

    우리는 상위 10 게시물을 선택합니다
  • 상단 (2) 각
  • 게시물에 대한 코멘트
  • 댓글 여기

오름차순으로 나열 할 필요가 우리의 똥개의 예 내림차순으로 나열해야 게시물과 댓글에 대한 쿼리를 임대 :

게시물 :

SELECT TOP 10 ForumPostID, ForumID, ContentText, Hidden, S.Firstname, S.Lastname, 
CONVERT(VARCHAR(30),DATEADD(hh,CASE 
     WHEN DD.StartDate IS NOT NULL THEN 5 ELSE 6 
     END, 
FP.PostDate),126)+'Z' AS PostDate, 
PostDate AS UglyTime, TopPostID, 
(SELECT COUNT(*) FROM Admin.dbo.ForumPosts WHERE TopPostID = FP.ForumPostID) AS  
'CommentCount', 
(SELECT COUNT(*) FROM Admin.dbo.ForumLikes WHERE ForumPostID = FP.ForumPostID) AS 'Likes',  
CASE (SELECT COUNT(*) FROM Admin.dbo.ForumLikes WHERE ForumPostID = FP.ForumPostID AND  
     Authuser = FP.Authuser) WHEN 0 THEN 'Like' ELSE 'You liked this.' END AS 'LikeText' 
FROM Admin.dbo.ForumPosts FP 
INNER JOIN Student.dbo.Student S 
     ON S.StudentUID = FP.Authuser 
INNER JOIN Admin.dbo.DayLightSavingsDates DD 
     ON FP.PostDate BETWEEN DD.StartDate AND DD.EndDate 
WHERE FP.ForumPostID NOT IN (SELECT Top 0 ForumPostID FROM Admin.dbo.ForumPosts FP2 ORDER BY 
FP2.ForumPostID DESC) 
AND FP.Hidden = 'N' AND FP.ContentText <> '' 
AND FP.PostType = 'post' 
ORDER BY FP.PostDate DESC 

댓글 :

SELECT TOP 50 ForumPostID, ForumID, ContentText, Hidden, S.Firstname, S.Lastname, 
CONVERT(VARCHAR(30),DATEADD(hh,CASE 
     WHEN DD.StartDate IS NOT NULL THEN 5 ELSE 6 END, 
FP.PostDate),126)+'Z' AS PostDate, 
PostDate AS UglyTime, TopPostID, 
(SELECT COUNT(*) FROM Admin.dbo.ForumPosts WHERE TopPostID = FP.ForumPostID) AS  
     'CommentCount', 
(SELECT COUNT(*) FROM Admin.dbo.ForumLikes WHERE ForumPostID = FP.ForumPostID) AS 'Likes', 
CASE (SELECT COUNT(*) FROM Admin.dbo.ForumLikes WHERE ForumPostID = FP.ForumPostID AND 
    Authuser = FP.Authuser) WHEN 0 THEN 'Like' ELSE 'You liked this.' END AS 'LikeText' 
FROM Admin.dbo.ForumPosts FP 
INNER JOIN Student .dbo.Student S 
ON S.StudentUID = FP.Authuser 
INNER JOIN Admin.dbo.DayLightSavingsDates DD ON FP.PostDate BETWEEN DD.StartDate AND DD.EndDate 
WHERE FP.ForumPostID NOT IN 
    (SELECT Top 0 ForumPostID FROM Admin.dbo.ForumPosts FP2 ORDER BY FP2.ForumPostID DESC) 
AND FP.ForumPostID IN 
    (SELECT Top 2 ForumPostID FROM Admin.dbo.ForumPosts FP3 WHERE FP3.TopPostID = FP.TopPostID 
     ORDER BY FP3.PostDate DESC) 
AND FP.Hidden = 'N' 
AND FP.ContentText <> '' 
AND FP.PostType = 'comment' 
AND FP.TopPostID IN (373, 371, 370, 369, 368, 367, 366, 365, 364, 363) 
ORDER BY FP.ForumPostID ASC 
+1

-1 : 코드를 읽을 수있는 형식으로 포맷하십시오! – Akhil

+0

죄송합니다. 버튼을 클릭하지는 않았지만 준비가 완료되기 전에 제출되었습니다. 지금은 조금 나아질 것입니다. – ilikenwf

+0

* 버튼이 클릭되었습니다! 맹세코! * –

답변

0

여기에 주어진 당신이 실행 계획을 볼 필요가 것입니다 할 수있는 가장 중요한 조언. 나는 그 주위에 방법을 모른다. 이 쿼리는 너무 복잡해서 구체적인 조언을 제공하지 않습니다.

한 가지 : "(COUNT (*) FROM Admin.dbo.ForumPosts WHERE TopPostID = FP.ForumPostID)와 같은 표현이 많습니다." SQL Server 쿼리 최적화 프로그램은 이러한 식을 계산에 사용하는 데 문제가 있습니다. 때로는 정상 조인으로 변환하지 못하여 많은 최적화 작업을 수행하지 못합니다. 조인으로 변환 할 수 있습니다. 그러나 IN 절은 지금까지 말할 수있는 한 안전합니다.

+0

나는 그 수를 테이블의 필드로 유지하고 트리거를 통해 이들을 maitnain 것이다. 백작은 매우 무거운 작업입니다. 카운트를 유지할 때 필요성을 완전히 없앱니다. – TomTom