2011-01-05 73 views
1

如果我已經定義在SQL Server這樣的觀點:SQL Server視圖表演

CREATE View V1 
AS 
SELECT *  
FROM t1 
INNER JOIN t2 ON t1.f1 = t2.f2  
ORDER BY t1.f1 

我應該期待

SELECT * FROM V1 WHERE V1.f1 = 100 

,只是避免視圖之間的性能差異,這樣

SELECT *  
FROM t1 
INNER JOIN t2 ON t1.f1 = t2.f2  
WHERE t1.f1 = 100 
ORDER BY t1.f1 

除了需要集中複雜查詢之外,我們沒有任何理由使用視圖。

謝謝

+5

視圖內的ORDER BY'不起作用。有一些雜質(<2005你可以指定'TOP 100 PERCENT'),但隨着優化器的改進,它變得毫無意義。如果您需要特定訂單,則必須在最外面的查詢中指定它。 – 2011-01-05 11:49:45

+1

使用where子句WHERE t1.f1 = 100後,使用t1.f1的順序沒有任何意義。即使結果集包含多行,那麼此順序也不做任何操作 – 2011-01-05 13:10:38

回答

5

應該沒有性能損失。

簡化複雜查詢是什麼意見。

如果性能是你所關心的 - 在SQL Server中讀到indexed views

索引視圖提供不能使用標準的指標來實現額外的性能優勢。索引視圖可以提高通過以下方式查詢性能:

  • 聚合可以預先計算和存儲在索引中,以儘量減少查詢執行過程中昂貴的計算。
  • 可以預先加入表格並存儲結果數據集。
  • 可以存儲連接或聚合的組合。
0

通常,您不應該期望性能差異,但請檢查您的查詢的執行計劃。

如果您將視圖加入到視圖中,那麼執行計劃可以是次優的,並且包含對可能已被合併的同一個表的重複訪問。還有可能會有意見和predicate pushing的問題。