2012-03-15 41 views
4

嗨,我們有一個存儲的過程,每天安排一個過濾後從具有大量數據的表中獲取記錄。我的問題是如果我在表上創建一個視圖,並從視圖中獲取數據將這是更快的過程還是更慢?更快地從視圖或表格中提取數據?

回答

6

標準視圖,它不應該有任何區別,因爲內部SQL只是擴展到查詢中。請注意,內聯表值用戶定義的函數(認爲「參數化視圖」)也適用。

但是,如果您將其設置爲indexed view,則可以看到性能提高。

0

只是補充@AdaTheDev答案:對於多語句表值函數

the same applies with table-valued user defined functions 

這就是內聯表值函數真實的,但不是100%正確的。第二種類型的功能將使用更多的資源(內存)比第一個

關於索引視圖,它可以幫助,但記住,它可以大大會增加你的存儲空間

+0

好的,我確實是指內聯UDF!我會更新我的答案,因爲這是非常重要的一點 – AdaTheDev 2012-03-15 12:15:25

3

只要記住,視圖只不過是一個選擇語句(索引視圖不同)。如果您有:

SELECT * FROM TABLE 

這是一個過程,如果你把同樣的事情在一個視圖,然後做:

SELECT * FROM VIEW 

內的流程,在這兩者之間絕對沒有區別。但是,如果事情變得更加複雜,以至於你加入了很多桌子,那麼這取決於他們如何被訪問。例如,如果您創建一個訪問6個表的視圖,然後編寫一個查詢,只需從這些表中的3箇中提取數據,那麼您可能會從優化過程中發生的稱爲簡化的過程中受益,你會看到一個只引用3個表的計劃。但是,你可能不會。如果不是,則針對3個表編寫的查詢通常比針對訪問多於3個表的視圖的計劃運行得更快。

如果您開始嵌套視圖,具有調用視圖或加入視圖的視圖,則可能會看到非常嚴重的性能下降。

一般來說,如果你使用存儲過程,我建議你直接寫你的查詢表。它不會損害性能,它可以幫助您避免嵌套視圖和計劃簡化問題。