Sql-Server

當我向視圖添加 WHERE 子句時,視圖是否得到優化?

  • March 21, 2012

如果您在視圖內部或外部過濾視圖,會有所不同嗎?

例如,這兩個查詢之間有什麼區別嗎?

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

這是執行計劃:

在此處輸入圖像描述

正如您從這些執行計劃中看到的那樣,它們具有相同的結果。我不知道這種類型的邏輯/設計會輸出不同結果的情況。所以我願意說無論哪種方式你都是安全的,並根據個人喜好(或商店程序)進行。

引用自:https://dba.stackexchange.com/questions/15363