提高查询速度

时间:2011-10-26 21:35:50

标签: sql sql-server sql-server-2008

好的,我有桌子:

ID Name    Description   Picture
1  Alex     Alex desc..     2
2  Maria      NULL          3
3  John      John desc..   NULL

表格图片有ID和varbinary图片。

我需要选择:如果描述存在,那么描述,否则图片 我这样做:

select Id,
       Name, 
       Case when Description is null then pic.Image else Description 
      from person per join picture pic on per.Picture = pic.Id

因此,如果description不为null,则看起来像不必要的join。 无论如何。有关改进此简单查询的任何建议吗?另外,在两个版本的查询之间进行性能比较有哪些易于使用的工具?

3 个答案:

答案 0 :(得分:4)

据我所知,无法在单个查询中有条件地加入。我可能会改写你所拥有的:

SELECT per.ID, per.Name, COALESCE(per.Description, pic.Image) as desc
FROM Person as per
LEFT JOIN Picture as pic
ON per.picture = pic.ID

我不确定性能如何比较,但似乎更清洁。

就比较查询而言,我建议查看两者的执行计划,看看是否正在进行任何扫描。以下是使用执行计划进行性能调整的一些信息:

您还可以使用Database Tuning Advisor快速查看是否有必要的索引。

小心不要花太多时间来优化。虽然随着数据库的增长,随时关注当前的性能和性能是很好的,但是很容易花费大量时间在此而不会得到太多的回报。如果你有一个良好的数据库结构和编写良好的查询,那么未来的优化不应该太痛苦。

答案 1 :(得分:1)

但是如果描述不是null,那么连接是必要的....那就是你的代码应该做的正确吗?

您可以粗略对查询进行计时,方法是用一对'select getdate()'语句包装它们并进行数学运算(或编写SQL来为您做数学运算)。

答案 2 :(得分:0)

您也可以这样做:

 select Id, Name, Description
 from person
 where description is not null
 union all
 select Id, Name, pic.image
 from person per 
 join picture pic on per.Picture = pic.Id
 where description is null

不确定性能如何,但您只是在需要时才进行连接,但代价是UNION。 Union All将消除对不同行进行排序的需要,这有助于提高性能。