2012-06-15 301 views
-1

我需要幫助優化我的一些SQL查詢。我的SQL性能不好。我有一個SQL Server 2008 RS Express,我不能使用DTA。需要幫助優化SQL Server查詢

可能可以幫我優化和手動這兩個查詢創建索引:

SELECT tblBlogs.RecordID, tblBlogs.RecordText, tblBlogs.CDate, tblBlogs.UserID, tblBlogs.Comments, tblUsers.Username, tblUserpics.UserpicName 
FROM ( 
     SELECT tblBlogs_2.RecordID, tblBlogs_2.RecordText, tblBlogs_2.CDate, tblBlogs_2.UserID, COUNT(dbo.tblBlogComments.CommentID) AS Comments 
     FROM ( 
     SELECT TOP (150) RecordID, RecordText, CDate, UserID 
      FROM dbo.tblBlogs AS tblBlogs_1 
      ORDER BY RecordID DESC 
      ) AS tblBlogs_2 
     LEFT OUTER JOIN dbo.tblBlogComments ON tblBlogs_2.RecordID = tblBlogComments.RecordID 
     GROUP BY tblBlogs_2.RecordID, tblBlogs_2.RecordText, tblBlogs_2.CDate, tblBlogs_2.UserID 
    ) AS tblBlogs 
INNER JOIN dbo.tblUsers ON tblBlogs.UserID = tblUsers.UserID 
LEFT OUTER JOIN dbo.tblUserpics ON tblBlogs.UserID = tblUserpics.UserID 
ORDER BY tblBlogs.CDate DESC 

這必須從博客檯面150 ROS與用戶詳細信息+爲每一個博客文章評論。

SELECT f.ForumID, f.ForumName, t.ThreadName, m.MsgID, m.MsgName, m.MsgBody, m.UserID, m.CDate, m.IP, u.Username, tblCities.CityName, 
t.IsClosed, ISNULL(u.Msgs, 0) AS Posts, ISNULL(tblUserpics.UserpicName, '') AS UserpicName, t.IsPoll, 
t.IsPollMultiple, ISNULL(u.Crashes, 0) AS Crashes, 0 AS LastMsgID, m.IsFlood, ISNULL(u.RepaGood, 0) AS RepaGood, ISNULL(u.RepaBad, 0) 
AS RepaBad, ISNULL(dbo.vMsgsRepaGood.RepaGood, 0) AS MsgRepaGood, ISNULL(dbo.vMsgsRepaBad.RepaBad, 0) AS MsgRepaBad, t.ThreadID, 
tblUserPrivateStatuses.StatusName AS PrivateStatus 
FROM tblMsgs AS m 
INNER JOIN tblThreads AS t ON m.ThreadID = t.ThreadID 
INNER JOIN tblForums AS f ON t.ForumID = f.ForumID 
INNER JOIN tblUsers AS u ON m.UserID = u.UserID 
LEFT OUTER JOIN tblUserPrivateStatuses ON u.UserID = dbo.tblUserPrivateStatuses.UserID 
LEFT OUTER JOIN tblCities ON u.CityID = dbo.tblCities.CityID 
LEFT OUTER JOIN tblUserpics ON u.UserID = dbo.tblUserpics.UserID 
LEFT OUTER JOIN vMsgsRepaGood ON m.MsgID = vMsgsRepaGood.MsgID 
LEFT OUTER JOIN vMsgsRepaBad ON m.MsgID = vMsgsRepaBad.MsgID 
WHERE m.ThreadID = "& ThreadID & " AND IsFlood = 0 
GROUP BY f.ForumID, f.ForumName, t.ThreadName, m.MsgID, m.MsgName, m.MsgBody, m.UserID, m.CDate, m.IP, u.Username, tblCities.CityName, t.IsClosed, u.Msgs, dbo.tblUserpics.UserpicName, t.IsPoll, t.IsPollMultiple, u.Crashes, m.IsFlood, u.RepaGood, u.RepaBad, vMsgsRepaGood.RepaGood, vMsgsRepaBad.RepaBad, t.ThreadID, tblUserPrivateStatuses.StatusName 
ORDER BY m.CDate</pre> 

此查詢選擇所有未從用戶細節的特定論壇充斥來自特定主題的信息(註冊時間,好/壞口碑的數量,死機的次數,張貼在這整個論壇的號碼,城市,userpic) 。

或者有人可以告訴我有關優化查詢和創建索引的免費工具嗎?

回答

1

這裏有很多需要討論的內容,如果沒有更多的信息,任何人都無法完全幫助您完成查詢。

注意事項:如果您的系統有DBA,請在索引任何內容之前與他們覈對,特別是在實時系統上。如果你對他們很好,他們甚至可以幫忙。如果系統被其他許多人使用,在更改索引之類的任何東西之前要小心。

上索引基本小費,如果你不想深入瞭解的問題,就是:指數以下,順序如下:

  1. 加入謂詞
  2. 過濾
  3. 訂單通過/分組依據/等

另外:

  • 確保任何可能的列都是非空的。
  • 使用有意義的數據類型 - 如果它是一個整數或日期,則不會將其存儲爲varchar。 (列寬很重要,如果可能,請使用最小的數據類型。)
  • 確保您的連接是相同的數據類型 - int爲int,varchar爲varchar,等等。
  • 如果可能,請在每個表的每個連接謂詞中使用唯一的非空索引。

完成所有這些,你就會順利完成任務。但如果你經常需要這些東西,那就去學習吧!這裏有很多,這是一個很深的話題,但如果你知道你在做什麼,你可以更好地進行查詢。

編輯:建立索引的語法如下:How do I index a database column。如何/爲什麼在這裏:How does database indexing work?

+0

我沒有DBA。你能解釋一下我可以如何索引某些東西?我知道它唯一的索引是在表中的列。 –

+0

準確地說 - 在每個表格上,索引由您需要的一列或多列組成。 –

+0

查找在線創建書籍索引。 – HLGEM