2011-10-26 139 views
2

好,我有表:增加查询速度

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 

所以,看起来不必要的加入,如果描述不为空。 反正。任何关于改进这个简单查询的建议?另外,什么是两个版本的查询之间性能比较的好用易用工具?

+1

你为什么担心这个JOIN?你遇到过性能问题吗?这可能是不成熟的优化。它只是一个2个整数的连接。如果您的索引已到位,它应该在忧虑列表的底部。 –

+0

我只是以这种方式做事,并希望社区建议如果有更好的做法。如果没有,那就好了。 – user194076

回答

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作为一个快速的方法来检查,看看是否有必要的索引。

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

+0

好的。谢谢,这就是我想知道的。合并使得阅读起来更容易。我只想从一开始就产生高质量的结果。 – user194076

1

但是,如果描述不为空,那么连接是必要的....这就是你的代码应该做的对吗?

您可以大致通过用一对'select getdate()'语句包装它们并进行数学运算(或者编写SQL来为您做数学运算)来计算您的查询时间。

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 All将消除分拣不同行的需要,这应该有助于提高性能。