My friend has been asked to optimize the SQL query for a forum application. Basically the Query is used to list the thread as well as the last person who posted on the forum. He and me tried to optimize that and we can fasten up the query up to only 13 secs which is not really well 🙁 . then the sql guru is coming to help him and show him the better way in writing the query and it performs only 1 sec. I thought it’s gonna be a good lesson to be shared it on my blog. There you go:
--Non Optimized Version SELECT ForumTopic.ForumTopicID, ForumTopic.Title, Members.Username AS MemberName, ForumTopic.Views, ForumTopic.Replies, ( SELECT TOP 1 ForumPost.EnteredDate FROM ForumPost WHERE ForumPost.ForumTopicID = ForumTopic.ForumTopicID ORDER BY ForumPost.ForumPostID DESC ) AS LastPostEnteredDate, ( SELECT TOP 1 Members.Username FROM ForumPost INNER JOIN Members ON ForumPost.EnteredBy = Members.MemberID WHERE ForumPost.ForumTopicID = ForumTopic.ForumTopicID ORDER BY ForumPost.ForumPostID DESC ) AS LastPostMemberName FROM ForumTopic INNER JOIN Members ON ForumTopic.EnteredBy = Members.MemberID WHERE ForumID = @ForumID AND ForumTopic.Valid = 1 ORDER BY LastPostEnteredDate DESC
--optimized version SELECT ForumTopic.ForumTopicID, ForumTopic.Title, Members.UserName as MemberName, ForumTopic.Views, ForumTopic.Replies, ForumPost.EnteredDate as LastPostEnteredDate, Members1.Username as LastPostMemberName FROM ( SELECT ForumTopicID, MAX(ForumPostID) AS ForumPostID FROM ForumPost WHERE ForumTopicID IN ( SELECT ForumTopicID FROM ForumTopic WHERE ForumTopic.ForumID = @ForumID AND ForumTopic.Valid = 1) GROUP BY ForumTopicID ) RecentPost INNER JOIN ForumPost ON ForumPost.ForumPostID = RecentPost.ForumPostID INNER JOIN ForumTopic ON ForumTopic.ForumTopicID = RecentPost.ForumTopicID INNER JOIN Members ON ForumTopic.EnteredBy = Members.MemberID INNER JOIN Members Members1 ON ForumPost.EnteredBy = Members1.MemberID ORDER BY ForumPost.EnteredDate DESC