索引(物化)視圖
視圖的基礎知識
什麼是視圖?
視圖也稱爲虛擬表,標準視圖的結果集不是永久地存儲在數據庫中。每次查詢引用標準視圖時,SQL Server 都會在內部將視圖的定義替換爲該查詢,直到修改後的查詢僅引用基表。然後,它將照常運行所得到的查詢。
註釋:數據庫的設計和結構不會受到視圖中的函數、where 或 join 語句的影響。不能對視圖進行增、刪、改操作
分類
邏輯(標準)視圖、索引(物化)視圖。
邏輯視圖和索引視圖
邏輯視圖就是我們平常見到的視圖,視圖的數據不獨立存儲,而是通過視圖的定義取原表的數據。
索引視圖,即物化視圖,顧名思義,是物化的,有實際存儲的,可以建立索引的。索引視圖對視圖的定義有很嚴格的要求。
爲什麼要用索引視圖
對於標準視圖而言,爲每個引用視圖的查詢動態生成結果集的開銷很大,特別是對於那些涉及對大量行進行復雜處理(如聚合大量數據或聯接許多行)的視圖。如果在查詢中頻繁地引用這類視圖,可通過對視圖創建唯一聚集索引來提高性能。對視圖創建唯一聚集索引後,結果集將存儲在數據庫中,就像帶有聚集索引的表一樣。
索引視圖的建立
要點
1.必須要加上WITH SCHEMABINDING, 就是綁定到架構.
2.創建完視圖後, 必須緊跟着創建一個CLUSTERED聚集唯一索引.
3.只支持兩部分命名的表或UDF, 如 dbo.SalesOrder.
4.涉及到多個表連接時, 不支持left join 或right join的寫法, 只能用from...where的方式或inner join的方式連接. (這一點有時很要命, 如果join多個表, 而這些表又不能都用inner join的方式時.)
5.不支持table.*這種懶省事的方式, 得一個一個把想要的列寫清楚.
實例
--設定會話設置
SET ANSI_NULLS ON
GO
SET ANSI_PADDING ON
GO
SET ANSI_WARNINGS ON
GO
SET CONCAT_NULL_YIELDS_NULL ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET NUMERIC_ROUNDABORT OFF
GO
--創建視圖(很多限制)
create VIEW vUserInfo
with SCHEMABINDING--綁定結構
AS
SELECT dbo.[User].ID,dbo.[User].AddTime,dbo.op.Name,dbo.op.Pwd
FROM dbo.[User]
INNER JOIN dbo.OP ON dbo.[User].ID=dbo.OP.ID
--創建聚集索引
CREATE UNIQUE CLUSTERED INDEX PK_vUserInfo ON vUserInfo(ID)
--視圖佔用多少空間
EXECUTE sp_spaceused 'vUserInfo'
https://msdn.microsoft.com/zh-cn/library/ms187864