用來儲存 SQL query,可以看作是 virtual table
Views
如果一個 view 是基於多個 tables 建立,更新該 view 時,underlying base tables 可能會無法正確更新,
因此為了正確更新 tables 需要使用INSTEAD OF
注意
view 不能傳參數,但可以使用 inline table-valued functions 作為替代方案
-- Error : Cannot pass Parameters to Views
CREATE View vWEmployeeDetails
@Gender nvarchar(20)
AS
SELECT Id, Name, Gender, DepartmentId
FROM tblEmployee
WHERE Gender = @Gender
-- Inline table-valued functions
CREATE FUNCTION fnEmployeeDetails(@Gender nvarchar(20))
RETURNS TABLE
AS
RETURN
(SELECT Id, Name, Gender, DepartmentId
FROM tblEmployee WHERE Gender = @Gender)
Select * from dbo.fnEmployeeDetails('Male')不能使用
RULES
和DEFAULTS
,因為 views 本身並沒有儲存 data不能使用
ORDER BY
,除非定義TOP
或FOR XML
views 不能以 temporary tables 建立
Indexed views
當 view 加入 index 則能夠儲存 data,
執行SELECT
時不需要再去 base table 取得資料,
若 base table 有進行 transaction 且 commit 時,view 也會跟著重新計算且更新
第一次在 view 加入 index,只能用UNIQUE CLUSTERED INDEX
,
因為 view 本身並沒有儲存任何 data,所以沒辦法用NON-CLUSTERED INDEX
用途
提升效能
使用時機
index view 適合使用在 base table data 不會時常改變的時候
維護 index view 的成本會高於 table index,
所以 index view 通常使用於 data warehousing
index view 適合 OLAP system (OnLine Analytical Processing),
若是使用於 OLTP system (On-Line Transaction Processing system) 可能會影響到效能
注意
If GROUP BY is specified, the view select list must contain a
COUNT_BIG(*)
expression, and the view definition cannot specifyHAVING
,ROLLUP
,CUBE
, orGROUPING SETS
.