【问题标题】:Need help in optmizing SQL Server queries在优化 SQL Server 查询方面需要帮助
【发布时间】:2012-06-18 16:16:52
【问题描述】:

我需要帮助来优化我的一些 SQL 查询。我的 SQL 性能不好。我有一个 SQL Server 2008 RS Express,但我不能使用 DTA。

也许可以帮助我优化和手动为这两个查询创建索引:

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>

此查询选择来自特定论坛的特定线程的所有未泛滥消息,其中包含用户详细信息(注册日期、好/坏名声的数量、崩溃的数量、整个论坛上的帖子数量、城市、用户图片)。

或者也许有人可以告诉我有关优化查询和创建索引的免费工具?

【问题讨论】:

    标签: sql-server-2008 indexing query-optimization


    【解决方案1】:

    这里有很多要讨论的内容,如果没有更多信息,任何人都无法完全帮助您完成查询。

    注意事项:如果您的系统有 DBA,请在索引任何内容之前与他们核实,尤其是在实时系统上。如果你对他们好,他们甚至可以提供帮助。如果系统被许多其他人使用,请在更改索引等任何内容之前小心。

    如果您不想深入研究问题,关于索引的基本技巧是:按以下顺序索引:

    1. 连接谓词
    2. 过滤器
    3. 排序方式/分组方式/等。

    还有:

    • 确保所有可能的列都不为空。
    • 使用有意义的数据类型 - 如果它是整数或日期,则不将任何内容存储为 varchar。 (列宽很重要。尽可能使用最小的数据类型。)
    • 确保您的联接是相同的数据类型 - int 到 int,varchar 到 varchar,等等。
    • 如果可能,请在每个表中的每个连接谓词上使用唯一的非空索引。

    做到这一切,你就会一路走好。但是,如果您经常需要这些东西,请学习它!那里有很多,而且这是一个很深的话题,但是如果您知道自己在做什么,就可以更好地进行查询。

    编辑:构建索引的语法在这里:How do I index a database column。如何/为什么在这里:How does database indexing work?

    【讨论】:

    • 我没有 DBA。您能解释一下我如何按某些东西进行索引吗?我知道的唯一索引是表中的列。
    • 完全正确 - 在每个表上,按您需要的一列或多列索引。
    • 在线查找在图书中创建索引。
    • 我知道如何按列创建索引,但是如何按联接/文件管理器/顺序索引?
    • @udar_molota:您需要使用列索引表。您可以根据查询的功能选择用于索引表的列 - 对于具有多列的索引,您希望首先选择您加入的列,然后是您过滤的列,最后是您分组的列。
    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2013-01-03
    相关资源
    最近更新 更多