2010-12-22 124 views
0

我支持SQL Server 2000到2008R2(所有標準版)。關於視圖的問題

問題1

請考慮以下假設情況。假設您有一個5表格視圖,表格內部已加入。我們進一步假設我從每個表中拉出10個字段,所以我有一個總共有50個字段的View。如果我從視圖中選擇了兩個字段(兩個表中的每一個都有一個),那麼假設您擁有所有相同的表和連接,該查詢是否會比等效的表連接腳本慢?

問題2

如果我創造了這樣一個腳本的一般看法:

Create View SomeView 
AS 

select * from SomeTable 
Go 

這些表有字段添加到它們相當定期。每次我向「SomeTable」添加一個字段時,視圖都會自動工作,對嗎?這是否明顯慢 如果我SomeTable有50個字段,我從通用視圖中選擇他們兩個?如果我從選擇*視圖中選擇兩個字段,它只會查詢這些字段?

問題3 如果我創建像下面

Create View Blah 
AS 
select (some fields) 
from TableA join TableB on TableA.Blah = TableB.Blah 
Go 

視圖然後我用這樣的觀點:

Select (some fields) from dbo.Blah where SomeDate >= '1/1/2008' 

我會失去任何性能?優化器實際上是否只會拉取適用的視圖記錄,或者是否會全部拉出,然後再選擇結果集?

TIA。

+1

別看使用`select *`創建一個視圖 - 這是一個非常糟糕的主意,因爲如果底層表發生變化,您可能會得到不同的數據值/類型 – RedFilter 2010-12-22 16:10:35

回答

2

每次我給「SomeTable」添加一個字段,視圖會自動工作,正確嗎?

沒有,看到這裏how to make sure that the view will have the underlying table changes by using sp_refreshview

那麼優化實際上只拉了適用查看記錄還是會拉都,然後選擇子結果集?

視圖是隻是一個存儲的查詢,優化器是足夠聰明,做一個範圍內尋求或掃描的只是它所需要的數據,你可以通過查看執行計劃

驗證這一點

所以我有一個總共有50個字段的視圖。如果我從視圖中選擇了兩個字段(兩個表中的每一個都有一個),那麼假設您擁有所有相同的表和連接,該查詢是否會比等效的表連接腳本慢?

再次運行統計10或對時間與查詢*和僅有2列,如果你看到一個差異讀取和時間

因此,例如

SET STATISTICS IO ON 
GO 

SELECT * FROM SomeView 

SET STATISTICS IO OFF 
GO 



SET STATISTICS IO ON 
GO 

SELECT Col1, Col2 FROM SomeView 

SET STATISTICS IO OFF 
GO 
+1

與其依靠記住使用`sp_refreshview`,不要在視圖中使用`select *` - 結果可能是b é災難! – RedFilter 2010-12-22 16:09:20