2010-09-07 51 views
2

從性能上來看是一樣這樣做:加入反對觀點:性能問題

select * from MYTABLEONE MT1 
join MYVIEW MV on MT1.ID = MV.ID 

( 其中的觀點是

create view MYVIEW as 
select MT2.*, MT3.* 
from MYTABLETWO MT2 
join MYTABLETHREE MT3 on MT2.OtherID = MT3.OtherID 

或者是最好做到這一點:

select MT1.*, MT2.*, MT3.* 
from MYTABLEONE MT1 
join MYTABLETWO MT2 on MT1.ID = MT2.ID 
join MYTABLETHREE MT3 on MT2.OtherID = MT3.OtherID 

回答

3

假設沒有索引視圖...

的視圖將像一個宏,應該產生同樣的計劃進行擴展。

擁有視圖除非重用,否則不會添加任何值。但是,您最終可以通過查看連接來查看連接,以查看擴展後哪個計劃比預期的計劃複雜得多。

恕我直言,除非你知道你在做什麼,否則不要使用視圖。

0

除非MYVIEW是一個索引視圖,否則在性能方面沒有任何損失或收益。

此外,通過查看實際執行計劃中的「估計子樹成本」,可以輕鬆比較兩個選擇。

0

它應該是一樣的。請大家開始相信DBMS比25年前更聰明。

3

人們會希望在這種簡單的情況下沒有任何區別。

當處理嵌套的視圖和視圖加入視圖雖然總是值得檢查執行計劃來確認這一點。

這裏的one example的情況下,加入視圖的計劃不是最佳。

也可能存在與predicate pushing問題意見