2012-03-22 10 views
1

私は私の投稿と私のコメントの両方を含むテーブルを持っています。私たちは一つのコメントだけを深く、コメントはコメントにしません。今、私たちはポストのためにajaxリクエストをしてから、別のクエリでコメントをつかんで、親の投稿IDを使って適切な子コメントをつかんでいます。SQL Server 2008スレッド化コメントシステム - 効率がさらに優れていますか?

私がしたいことは、これを最も効率的な単一のクエリシステムに統合することです。

これは私が間違っていない場合は、CROSSはAPPLYを使用して、またはUNIONのいずれかに私を残しますが、いくつか注意点があります。

    我々は、トップ10の記事を選択したい
  • とトップ2は、各
  • 投稿へのコメントは
  • コメントはここ

昇順でリストする必要が私たちのCURの例です降順でリストされる必要があります投稿やコメントの家賃クエリ:

投稿:

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

最も重要なアドバイスは、あなたが実行計画を調べる必要がありということです。私はそれを回避する方法を知らない。クエリが複雑すぎて具体的なアドバイスができません。

1つのこと:「(COUNT(*)FROM Admin.dbo.ForumPosts WHERE TopPostID = FP.ForumPostIDから)」のような表現がたくさんあります。 SQL Serverクエリオプティマイザは、計算でこのような式を使用することに問題があります。通常の結合に変換することができず、多くの最適化ができません。それらを結合に変換することもできます。しかし、IN節は私が今言うことができる限り安全です。

+0

私はこれらのカウントをテーブル内のフィールドとして保持し、トリガーを介してそれらをカウントします。カウントは非常に重い操作です。あなたはカウントを維持するときに必要性を完全に殺します。 – TomTom

関連する問題