Sql-Server
當我向視圖添加 WHERE 子句時,視圖是否得到優化?
如果您在視圖內部或外部過濾視圖,會有所不同嗎?
例如,這兩個查詢之間有什麼區別嗎?
SELECT Id FROM MyTable WHERE SomeColumn = 1
要麼
SELECT Id FROM MyView WHERE SomeColumn = 1
並且
MyView
被定義為SELECT Id, SomeColumn FROM MyTable
如果源表位於連結伺服器上,答案是否有所不同?
我問是因為我必須從連結伺服器查詢一個大表(4400 萬行)兩次,並獲得結果的匯總。我想知道我是否應該創建兩個視圖來訪問數據,一個用於每個查詢,或者我是否可以使用單個視圖和一個
WHERE
子句。
您應該看到這兩種選擇之間的計劃或性能絕對沒有差異。當查詢視圖時,它會擴展為針對基表的查詢,這意味著將使用相同的查找或掃描。
現在,根據 的數據類型和選擇性
MyColumn
,如果您想在基表上創建過濾索引(當您遷移到 SQL Server 2008+ 時),您可能會獲得更好的性能,但這同樣不會通過視圖有所不同或沒有。
這裡只是一個簡單的例子,表明應該沒有區別。數據庫就是
AdventureWorks
數據庫。兩個視圖定義:
create view Person.vContactWhere as select * from person.Contact where ContactID = 24 go create view Person.vContactNoWhere as select * from person.Contact go
這將是第一個查詢,該
WHERE
子句包含在視圖定義中:select * from person.vContactWhere
這是執行計劃:
第二個查詢,
WHERE
子句不在視圖定義中,而是在SELECT
查詢中:select * from person.vContactNoWhere where ContactID = 24
這是執行計劃:
正如您從這些執行計劃中看到的那樣,它們具有相同的結果。我不知道這種類型的邏輯/設計會輸出不同結果的情況。所以我願意說無論哪種方式你都是安全的,並根據個人喜好(或商店程序)進行。