2011-10-26 174 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將消除分揀不同行的需要,這應該有助於提高性能。