2012-06-15 239 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