A-How's BLOG

記錄一些筆記

【SQL】Views

用來儲存 SQL query,可以看作是 virtual table

  • Views
  • Indexed views


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')
  • 不能使用RULESDEFAULTS,因為 views 本身並沒有儲存 data

  • 不能使用ORDER BY,除非定義TOPFOR 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 specify HAVING, ROLLUP, CUBE, or GROUPING SETS.

參考連結