我的T-SQL查询是否有效写入?

时间:2011-01-03 20:18:20

标签: sql-server sql-server-2005 tsql

SELECT o.oxxxxID, 
       m.mxxxx, 
       txxxx, 
       exxxxName, 
       paxxxxe, 
       fxxxxe,
       pxxxx, 
       axxxx, 
       nxxxx, 
       nxxxx, 
       nxxxx, 
       ixxxx, 
       CONVERT(VARCHAR, o.dateCreated, 103)
FROM Offer o INNER JOIN Mxxxx m ON o.mxxxxID = m.mxxxxID
             INNER JOIN EXXXX e ON e.exxxxID = o.exxxxID 
             INNER JOIN PXXXX p ON p.pxxxxxxID = o.pxxxxID
             INNER JOIN Fxxxx f ON f.fxxxxxID = o.fxxxxxID
WHERE o.cxxxxID = 11

上述查询预计每天约有1000名访问者通过网站执行。 写得不好而且很有可能导致性能不足?如果是,请您建议我如何改进它。

注意:每个表只有一个索引(主键)。

6 个答案:

答案 0 :(得分:3)

对我来说很好。

现在,对于性能部分,您需要确保使用适当的索引来覆盖要过滤和加入的列(外键等)。

一个好的开始是做一个实际执行计划,或者简单的路线,对索引调整向导运行它。

SQL 2008中的实际执行计划(也许是2005年)将为您提供缺少的索引提示。

答案 1 :(得分:2)

这主要取决于表中定义的键和索引。如果你能提供那些可以给出更好的答案。虽然查询看起来没问题(除了所有名称中的xxx),如果你加入没有索引的字段,或者where子句中的字段没有索引,那么你可能会遇到更大数据集的性能问题。 / p>

答案 2 :(得分:2)

对我来说看起来很不错。我可能做的唯一改进可能就是按原样输出o.datecreated并让客户端对其进行格式化。

您还可以向连接列添加索引。

如果性能存在问题且空间不大,则可能还有可能创建索引视图。

答案 3 :(得分:2)

在不知道数据内容的情况下很难说,但它看起来像一个完全有效的SQL语句。许多连接可能会降低性能,但你可以使用fw策略来提高性能......我有一些想法。

  • 索引视图通常可以提高性能
  • 存储过程将为您启用查询并保存优化查询
  • 或者如果可能的话,创建一个不活动的一次性表,但只包含非规范化格式的此语句中的数据。这个开关表需要定期更新,但如果在您的情况下可以使用此策略,您可以获得一些巨大的性能提升。

对于一般性能问题和想法,如果你还没有完成,这是一个很好的起点:http://msdn.microsoft.com/en-us/library/ff647793.aspx

这个也非常好:http://technet.microsoft.com/en-us/magazine/2006.01.boostperformance.aspx

答案 4 :(得分:1)

实际上,您的查询看起来非常好。我们无法知道它是否可以改进的唯一一点是在JOINS和WHERE语句中使用的列上是否存在索引和键。除此之外,我没有看到任何可以改进的东西。

答案 5 :(得分:1)

如果主键上只有单个索引,则索引不太可能覆盖select语句中的所有数据输出。那么将会发生的情况是,查询可以有效地找到每个主键的行,但是需要使用书签查找来查找数据行并提取其他列。

因此,尽管查询本身可能正常(日期转换除外),只要输出中确实需要所有这些列,就可以通过向索引添加其他列来改进执行计划。群集索引键不允许包含列,这可能也是您的主键强制执行,并且您不太可能希望将其他列添加到主键,因此这意味着要创建一个额外的非聚集索引首先是PK列,然后包括其他列。

此时索引将覆盖查询,并且不需要执行书签查找。请注意,索引需要支持最常见的使用方案,并且您添加的索引越多,写入性能就越慢,因为所有索引都需要更新。

此外,您可能还想查看约束,因为当优化程序可以确定不存在外部联接或交叉时,如果表未用于任何输出列,优化程序可以使用这些约束来消除联接连接将消除或乘以行。