SQL Server索引 - 索引(物化)視圖 <第九篇>

1、索引視圖基本概念

  索引視圖其實是一種將一組惟一值「物化」爲羣集索引形式的視圖,所爲物化就是幾乎和表同樣,其數據也是會存儲一份的(會佔用硬盤空間,可是查詢速度快,例如能夠將count(),sum()等值設在索引視圖中)。其優勢是它在提取視圖背後的信息方面提供了一個很是快的查找方法。在第一個索引(必須是針對一組惟一值的彙集索引)以後,經過使用來自第一個索引的彙集鍵做爲參考點,SQL Server還能在視圖上創建額外的索引。其限制以下:數據庫

  1. 視圖必須使用SCHEMABINDING選項;
  2. 若是視圖引用了任何用戶自定義函數,那麼這些函數也必須是模式綁定的;
  3. 視圖不能夠引用任何其餘的視圖-只能引用表和UDF;
  4. 在視圖中引用的全部表和UDF必須採用兩部分的命名約定(例如:dbo..Customers),而且也必須具備和視圖相同的全部者;
  5. 視圖和視圖引用的全部對象必須在相同的數據庫中;
  6. 在建立視圖和全部底層表時,必須打開ANSI_NULLS以及QUOTED_IDENTIFIER選項;
  7. 視圖引用的任何函數必須是肯定的;

   示例:函數

  CREATE VIEW CustomerOrders_vw
  WITH SCHEMABINDING
  AS
  SELECT ....

  當建立索引時,在視圖上建立的第一個索引必須是彙集的和惟一的:工具

  CREATE UNIQUE CLUSTERED INDEX ivCustomerOrders
  ON CustomerOrders_vw(AccountNumber,SalesOrderID,ProductID)

  一旦執行該命令,就有了視圖的羣集索引。索引基本和表的同樣,也須要維護成本。post

2、索引視圖做用示例

  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語句的執行速度減慢多少?這必須考慮進去,這是個平衡問題,要視每一個表和每一個索引而定。儘管如此,索引視圖仍是一種較強大的工具,所以做仔細地權衡。

相關文章
相關標籤/搜索