索引視圖其實是一種將一組惟一值「物化」爲羣集索引形式的視圖,所爲物化就是幾乎和表同樣,其數據也是會存儲一份的(會佔用硬盤空間,可是查詢速度快,例如能夠將count(),sum()等值設在索引視圖中)。其優勢是它在提取視圖背後的信息方面提供了一個很是快的查找方法。在第一個索引(必須是針對一組惟一值的彙集索引)以後,經過使用來自第一個索引的彙集鍵做爲參考點,SQL Server還能在視圖上創建額外的索引。其限制以下:數據庫
示例:函數
CREATE VIEW CustomerOrders_vw WITH SCHEMABINDING AS SELECT ....
當建立索引時,在視圖上建立的第一個索引必須是彙集的和惟一的:工具
CREATE UNIQUE CLUSTERED INDEX ivCustomerOrders ON CustomerOrders_vw(AccountNumber,SalesOrderID,ProductID)
一旦執行該命令,就有了視圖的羣集索引。索引基本和表的同樣,也須要維護成本。post
PersonTenMillion是一張一千萬記錄的表,下面咱們來執行以下SQL語句:優化
SELECT Age,COUNT(Age) FROM PersonTenMillion GROUP BY Age ORDER BY Age
對一張1千萬記錄的表進行分組計算每一個年齡的認輸,你能夠想象到須要花費的時間了。spa
1分31秒,這種查詢語句若是在網頁上面,頁面已經顯示頁面沒法響應了。code
下面咱們來優化上面這個查詢,咱們建立一個索引視圖以下:對象
--建立模式綁定視圖 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)
此次咱們從索引視圖上獲取數據:blog
SELECT * FROM PersonAge_vw
此次是瞬間出來的,由於只是至關於從一個81行的表中使用匯集索引分那會81行數據:索引
查詢速度快了好多好多,但這覺得這索引視圖是好的選擇嗎?不是的,這隻意味着它多是。和任何索引同樣,須要記住索引的維護成本。維護該索引將會使對底層表的INSERT、UPDATE和DELETE語句的執行速度減慢多少?這必須考慮進去,這是個平衡問題,要視每一個表和每一個索引而定。儘管如此,索引視圖仍是一種較強大的工具,所以做仔細地權衡。