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名访问者通过网站执行。 写得不好而且很有可能导致性能不足?如果是,请您建议我如何改进它。
注意:每个表只有一个索引(主键)。
答案 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列,然后包括其他列。
此时索引将覆盖查询,并且不需要执行书签查找。请注意,索引需要支持最常见的使用方案,并且您添加的索引越多,写入性能就越慢,因为所有索引都需要更新。
此外,您可能还想查看约束,因为当优化程序可以确定不存在外部联接或交叉时,如果表未用于任何输出列,优化程序可以使用这些约束来消除联接连接将消除或乘以行。