好的,我有桌子:
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。 无论如何。有关改进此简单查询的任何建议吗?另外,在两个版本的查询之间进行性能比较有哪些易于使用的工具?
答案 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将消除对不同行进行排序的需要,这有助于提高性能。