一、索引視圖基本概念
索引視圖實際上是一種將一組唯一值“物化”為群集索引形式的視圖,所為物化就是幾乎和表一樣,其數據也是會存儲一份的(會占用硬盤空間,但是查詢速度快,例如可以將count(),sum()等值設在索引視圖中)。其優點是它在提取視圖背后的信息方面提供了一個非常快的查找方法。在第一個索引(必須是針對一組唯一值的聚集索引)之后,通過使用來自第一個索引的聚集鍵作為參考點,SQL Server還能在視圖上建立額外的索引。其限制如下:
- 視圖必須使用SCHEMABINDING選項;
- 如果視圖引用了任何用戶自定義函數,那么這些函數也必須是模式綁定的;
- 視圖不可以引用任何其他的視圖-只能引用表和UDF;
- 在視圖中引用的所有表和UDF必須采用兩部分的命名約定(例如:dbo..Customers),並且也必須具有和視圖相同的所有者;
- 視圖和視圖引用的所有對象必須在相同的數據庫中;
- 在創建視圖和所有底層表時,必須打開ANSI_NULLS以及QUOTED_IDENTIFIER選項;
- 視圖引用的任何函數必須是確定的;
示例:
CREATE VIEW CustomerOrders_vw WITH SCHEMABINDING AS SELECT ....
當創建索引時,在視圖上創建的第一個索引必須是聚集的和唯一的:
CREATE UNIQUE CLUSTERED INDEX ivCustomerOrders ON CustomerOrders_vw(AccountNumber,SalesOrderID,ProductID)
一旦執行該命令,就有了視圖的群集索引。索引基本和表的一樣,也需要維護成本。
二、索引視圖作用示例
PersonTenMillion是一張一千萬記錄的表,下面我們來執行如下SQL語句:
SELECT Age,COUNT(Age) FROM PersonTenMillion GROUP BY Age ORDER BY Age
對一張1千萬記錄的表進行分組計算每個年齡的認輸,你可以想象到需要花費的時間了。
1分31秒,這種查詢語句如果在網頁上面,頁面已經顯示頁面無法響應了。
下面我們來優化上面這個查詢,我們創建一個索引視圖如下:
--創建模式綁定視圖 CREATE VIEW PersonAge_vw WITH SCHEMABINDING AS SELECT Age,COUNT_BIG(*) AS CountAge FROM dbo.PersonTenMillion GROUP BY Age --為視圖創建索引 CREATE UNIQUE CLUSTERED INDEX ivPersonAge ON PersonAge_vw(Age)
這次我們從索引視圖上獲取數據:
SELECT * FROM PersonAge_vw
這次是瞬間出來的,因為只是相當於從一個81行的表中使用聚集索引分那會81行數據:
查詢速度快了好多好多,但這以為這索引視圖是好的選擇嗎?不是的,這只意味着它可能是。和任何索引一樣,需要記住索引的維護成本。維護該索引將會使對底層表的INSERT、UPDATE和DELETE語句的執行速度減慢多少?這必須考慮進去,這是個平衡問題,要視每個表和每個索引而定。盡管如此,索引視圖還是一種較強大的工具,因此作仔細地權衡。