2013-02-23 99 views
1

我張貼我的搜索的簡化版本,在SQL基本連接多個表2008更好的方式來連接表?

select * from t1 
inner join t2 on t1.id = t2.id 
inner join t3 on t2.id = t3.id 
inner join t4 on t3.id = t4.id 
inner join t5 on t4.id = t5.id 

我想知道有沒有辦法讓這個查詢存儲爲對象的一部分。不是結果而是查詢邏輯。

讓我們說,我想重用

inner join t3 on t2.id = t3.id 
inner join t4 on t3.id = t4.id 
inner join t5 on t4.id = t5.id 
在不同的查詢

,像

select * from t1 
inner join t2 on t1.id = t2.id 
inner join t_stored on t_stored.id = t3.id 

我想已經t_stored定義爲一個視圖,或者函數或存儲過程中(包括預期一個參數),但我不確定這會如何影響性能。 不管最終結果如何複雜,將它全部保存在主查詢中會更好嗎?

回答

1

如你所知MS SQL性能純粹是基於查詢執行計劃被如何產生的,它如何被緩存爲執行上下文線程更好的打擊。通過創建視圖來重複使用連接的選項是一個不錯的選擇,但在鍵匹配前您不會獲得任何優勢。

重用的問題仍然存在;視圖是最好的選擇,但是如果您不需要結果集並且右聚簇索引受到重用查詢的影響,則性能會發生顯着變化。

我個人的經驗表明,最佳的性能是通過具有所有這些表需要在查詢中加入來實現的。因爲它允許你獲得對查詢的更多控制,只需通過修改查詢來使EXISTS語句比使用JOINs(如果你不期望在結果集中使用這些表字段)。

看看如何通過查看計劃緩存這http://msdn.microsoft.com/en-us/library/ee343986(v=sql.100).aspx

0

我不認爲這是一個明確的回答你的問題。不同的數據庫有不同的優化。我的直覺是,假設你的例子代表加入(希望)正確索引的FK限制,它應該沒有區別或者不是實質性的。
通過允許DBMS更好地緩存視圖,爲常用數據創建視圖甚至可以提高性能。
但是實際上沒有想出來,看着這兩個選項我不能肯定的執行計劃,這是你應該做的可能。

相關問題