Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 需要关于优化SQL Server查询的帮助吗_Sql Server 2008_Indexing_Query Optimization - Fatal编程技术网

Sql server 2008 需要关于优化SQL Server查询的帮助吗

Sql server 2008 需要关于优化SQL Server查询的帮助吗,sql-server-2008,indexing,query-optimization,Sql Server 2008,Indexing,Query Optimization,我需要帮助优化一些SQL查询。我的SQL性能不好。我有SQL Server 2008 RS Express,不能使用DTA May可以帮助我优化和手动创建这两个查询的索引: SELECT tblBlogs.RecordID, tblBlogs.RecordText, tblBlogs.CDate, tblBlogs.UserID, tblBlogs.Comments, tblUsers.Username, tblUserpics.UserpicName FROM ( SELEC

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

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

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
这必须从Blogs表中选择前150名ros,每个Blog条目都有用户详细信息+评论

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>
选择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)作为post,ISNULL(tblUserpics.UserpicName,'')作为UserpicName,t.IsPoll,
t、 IsPollMultiple,ISNULL(u.Crash,0)作为崩溃,0作为LastMsgID,m.IsFlood,ISNULL(u.RepaGood,0)作为RepaGood,ISNULL(u.RepaBad,0)
作为RepaBad,ISNULL(dbo.vmsgrepagood.RepaGood,0)作为MsgRepaGood,ISNULL(dbo.vmsgrepabad.RepaBad,0)作为msgrepaad,t.ThreadID,
TBluserPrivatestauses.StatusName作为PrivateStatus
来自tblMsgs作为m
内部联接TBL在m.ThreadID=t.ThreadID上读取为t
t.ForumID=f.ForumID上的内部连接tblForums为f
在m.UserID=u.UserID上作为u的内部连接TBluser
u.UserID=dbo.tblUserPrivateStatuses.UserID上的左外连接tblUserPrivateStatuses
u.CityID=dbo.tblCities.CityID上的左外部联接tblCities
u.UserID=dbo.tblUserpics.UserID上的左外连接tblUserpics
m.MsgID=vmsgrepagood.MsgID上的左外部联接vmsgrepagood
m.MsgID=vmsgrepabad.MsgID上的左外部联接vmsgrepabad
其中m.ThreadID=“&ThreadID&”和IsFlood=0
按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.ispolllmultiple、u.crash、m.IsFlood、u.RepaGood、u.RepaBad、vMsgsRepaGood.RepaGood、t.thread、tbluserprivatus.status进行分组
CDate先生订购
此查询选择来自特定论坛特定线程的所有未泛滥消息,其中包含用户详细信息(注册日期、良好/不良声誉的数量、崩溃的数量、整个论坛上的帖子数量、城市、userpic)


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

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

预防措施:如果您的系统有DBA,请在索引任何内容之前与他们进行检查,特别是在实时系统上。如果你对他们好,他们甚至可以帮忙。如果该系统被许多其他人使用,那么在更改诸如索引之类的内容之前要小心

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

  • 连接谓词
  • 滤器
  • 订货人/分组人/等
  • 此外:

    • 确保所有可能的列都不为null
    • 使用有意义的数据类型——如果是整数或日期,则不将任何内容存储为varchar。(列宽很重要。尽可能使用最小的数据类型。)
    • 确保联接的数据类型相同—int到int、varchar到varchar,依此类推
    • 如果可能,对每个表中的每个连接谓词使用唯一的非空索引
    做所有这些,你就会在路上顺利。但是如果你经常需要这些东西,就去学吧!有很多,这是一个深刻的话题,但如果你知道你在做什么,你可以让查询做得更好


    编辑:构建索引的语法如下:。如何/为什么在这里:

    我没有DBA。你能解释一下我是如何通过索引的吗?我知道的唯一索引是表中的列。确切地说,在每个表上,按您需要的一列或多列进行索引。在联机丛书中查找创建索引。我知道如何按列创建索引,但如何按join/filer/order by进行索引?@udar\u molota:您需要使用列对表进行索引。您可以根据查询的操作选择要用于索引表的列—对于具有多列的索引,您需要首先选择要加入的列,然后选择筛选依据的列,最后选择分组依据的列。