四、物理优化(2)索引视图
一、視圖的概念
1.?虛擬表
SQL?Server中的視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖并不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,并且在引用視圖時動態生成。?
?
2.?使用視圖的原因
視圖是存儲在數據庫中的查詢的SQL?語句,它主要出于兩種原因:
(1)簡化Select?查詢
通過視圖,不僅可以簡化用戶對數據的理解,也可以簡化他們的操作。那些被經常使用的查詢可以被定義為視圖,從而使得用戶不必為以后的操作每次指定全部的條件。
?
(2)安全原因
視圖可以隱藏一些數據,如:薪資表,可以用視圖只顯示雇員編號、姓名等基礎信息,而不顯示身份證號碼、薪資數等敏感信息。
SQL?Server?2005?及后續版本,將系統表隱藏起來,只提供一些系統視圖用于查看系統表的部分數據。
?
3.?對視圖的操作
從數據庫系統內部來看,視圖是由一張或多張表中的數據組成的,從數據庫系統外部來看,視圖就如同一張表一樣,對表能夠進行的一般操作都可以應用于視圖,例如查詢、插入、修改、刪除操作等。
對于標準視圖而言,結果集不永久存儲在數據庫中。每次查詢引用標準視圖時,SQL?Server?都會在內部將視圖的定義替換為該查詢,直到修改后的查詢僅引用基表。然后,它將照常運行所得到的查詢。生成視圖結果的過程稱為視圖具體化。
不能對視圖創建篩選索引。但是,查詢優化器可以從對視圖中引用的表定義的篩選索引中獲益。對于從視圖中選擇數據的查詢,如果查詢結果正確,查詢優化器會考慮對此查詢使用篩選索引。
?
二、視圖的分類
1.?系統視圖
為了防止用戶修改SQL?Server系統中的一些重要的表,系統提供了一些只讀的系統視圖。這些視圖一般屬于sys架構。
?
2.?用戶定義的視圖?
用戶定義的視圖是通過T-SQL語句或者GUI創建的。
?
三、索引視圖
1.?概念
SQL?Server?2000?及后續版本支持在視圖上定義索引。
? 對于涉及對大量的行進行復雜處理的非索引視圖,為引用視圖的每個查詢動態生成結果集的開銷會很大。這類視圖包括聚集大量數據或聯接許多行的視圖。若經常在查詢中引用這類視圖,可通過在視圖上創建唯一聚集索引來提高性能。在視圖上創建唯一聚集索引時將執行該視圖,并且結果集將存儲在數據庫中,就像帶有聚集索引的表一樣。
?
2.?索引視圖的好處
(1)加速查詢
對于涉及對大量的行進行復雜處理的視圖,由于結果集已經保存為一張帶有聚集索引的表,因此無需重新計算,索引視圖有明顯的速度優勢。
?
(2)查詢優化器引用
即使未在?FROM?子句中指定使用視圖,查詢優化器也可以使用索引視圖。這樣一來,可從索引視圖檢索數據而無需重新編碼,設計良好的索引視圖可以加快許多查詢的處理速度。例如:
| CREATE?VIEW?ExampleView?WITH?SCHEMABINDING AS SELECT?GroupKey,?SUM(Colx)?AS?SumColx,?COUNT_BIG(Colx)?AS?CountColx FROM?MyTable GROUP?BY?GroupKey |
此視圖不僅能滿足直接引用視圖ExampleView?時的查詢,還可用于滿足查詢基表MyTable并包含?SUM(Colx)、COUNT_BIG(Colx)、COUNT(Colx)?和?AVG(Colx)?等表達式的查詢。因為所有這些查詢只須在視圖中檢索少量的行,而不需要從基表中讀取全部行,所以查詢速度將更快。
同樣,聚合數據并按天分組的索引視圖可用于滿足聚合?1?天以上(如?7、30?或?90?天)的幾個不同范圍的查詢。
?
3.?索引視圖的限制
(1)版本限制
索引視圖可以在?SQL?Server?2008?的任何版本中創建。
在?SQL?Server?2008?Enterprise?中,查詢優化器會自動考慮索引視圖。若要在其他所有版本中使用索引視圖,則必須使用?NOEXPAND?表提示。
?
(2)索引的唯一性
視圖的聚集索引必須唯一,從而提高了?SQL?Server?在索引中查找受任何數據更改影響的行的效率。
必須設置特定的?SET?選項后才能在視圖上創建索引。
?
(3)維護開銷
與基表上的索引相比,對索引視圖的維護可能更復雜。
?
?
四、創建索引視圖
http://technet.microsoft.com/zh-cn/library/ms191432(v=sql.105).aspx
1.?基本方法
在視圖上創建聚集索引可存儲創建索引時生成的結果集。索引視圖還自動反映自創建索引后對基表數據所做的更改,這一點與在基表上創建的索引相同。當對基表中的數據進行更改時,索引視圖中存儲的數據也反映數據更改。
視圖上的索引命名規則與表上的索引命名規則相同。唯一區別是表名由視圖名替換。
盡管?CREATE?UNIQUE?CLUSTERED?INDEX?語句僅指定組成聚集索引鍵的列,但視圖的完整結果集將存儲在數據庫中。
在視圖上創建的第一個索引必須是唯一聚集索引。在創建唯一聚集索引后,可創建其它非聚集索引。若除去視圖,視圖上的所有索引也將被除去。若除去聚集索引,視圖上的所有非聚集索引也將被除去??煞謩e除去非聚集索引。除去視圖上的聚集索引將刪除存儲的結果集,并且優化器將重新像處理標準視圖那樣處理視圖。
?
2.?對視圖的要求
在對視圖創建聚集索引之前,該視圖必須符合下列要求:
(1)當執行?CREATE?VIEW?語句時,ANSI_NULLS?和?QUOTED_IDENTIFIER?選項必須設置為?ON。OBJECTPROPERTY?函數通過?ExecIsAnsiNullsOn?或?ExecIsQuotedIdentOn?屬性為視圖報告此信息。
(2)要執行所有?CREATE?TABLE?語句以創建視圖引用的表,ANSI_NULLS?選項必須設置為?ON。
(3)視圖不能引用任何其他視圖,只能引用基表。而且所有基表必須與視圖位于同一數據庫中,并且所有者也與視圖相同。
(4)必須使用?SCHEMABINDING?選項創建視圖。架構綁定將視圖綁定到基礎基表的架構。必須已使用?SCHEMABINDING?選項創建了視圖引用的用戶定義函數。
(5)表和用戶定義函數必須由視圖中由兩部分組成的名稱引用。不允許由一部分、三部分和四部分組成的名稱引用它們。
(6)視圖中的表達式引用的所有函數必須是確定的。非確定性函數,例如GETDATE、NEWID、@@total_errors等。還有一些函數在以確定性方式指定后,才可用于索引視圖,例如CAST、CONVERT、RAND等。http://technet.microsoft.com/zh-cn/library/ms178091(v=sql.105).aspx
?
3.?CREATE?INDEX語句的要求
CREATE?INDEX?除了符合?CREATE?INDEX?的常規要求之外,還必須符合下列要求:
執行?CREATE?INDEX?語句的用戶必須是視圖所有者。
執行?CREATE?INDEX?語句時,下列?SET?選項必須設置為?ON:ANSI_NULLS、ANSI_PADDING、ANSI_WARNINGS、CONCAT_NULL_YIELDS_NULL、QUOTED_IDENTIFIER
NUMERIC_ROUNDABORT?選項必須設置為?OFF。這是默認設置。
如果數據庫在?80?或更低的兼容模式下運行,則?ARITHABORT?選項必須設置為?ON。
創建聚集索引或非聚集索引時,IGNORE_DUP_KEY?選項必須設置為?OFF(默認設置)。
即使?CREATE?INDEX?語句中未引用?text、ntext?或?image?列,視圖中也不能包含這些列。
如果視圖定義中的?SELECT?語句指定了一個?GROUP?BY?子句,則唯一聚集索引的鍵只能引用在?GROUP?BY?子句中指定的列。
構成索引鍵列值的不精確表達式必須引用視圖下基表中的存儲列。該列可以是常規存儲列,也可以是持久化計算列。其他不精確表達式不能作為索引視圖的鍵列的一部分。
?
?
五、索引視圖的應用場景?
1.?權衡
對索引視圖的維護將增加系統開銷,因此需要權衡以下兩者:
(1)查詢視圖結果所需的開銷。如果是頻繁查詢,請考慮累計的開銷。
(2)維護索引視圖所需的開銷。
?
2.?建議
建議以下場景:
(1)需要頻繁查詢的視圖,同時基表不具有大量更新。
(2)視圖映射在相對靜態的數據上。
(3)處理大量行或經常查詢的、帶有聯接和聚合操作的視圖。?
(4)需要復雜計算的視圖。
?
3.?索引視圖與查詢相結合
雖然對可索引的視圖類型的限制可能使您無法設計完全解決某個問題的視圖,但仍可以設計多個較小的索引視圖,從一定程度上加快進程的速度。請考慮下列示例:
假設有一個經常執行的查詢首先要聚合一個數據庫中的數據,然后聚合另一個數據庫中的數據,再將結果聯接起來。因為索引視圖不能引用多個數據庫中的表,所以不能設計單個視圖來完成整個處理過程。但是,您可以在每個數據庫中創建一個索引視圖,分別為每個數據庫執行聚合操作。如果優化器可以將這些索引視圖與現有查詢匹配,那么至少會加快聚合處理的速度,因為無須對現有查詢重新編碼。雖然聯接處理速度沒有加快,但因為查詢使用了索引視圖中存儲的聚合,所以總體速度將加快。
假設有一個經常執行的查詢首先要聚合幾個表中的數據,然后使用?UNION?組合結果。索引視圖中不允許使用?UNION。同樣,您可以設計一些視圖來執行每個聚合操作。這樣一來,優化器就可以選擇索引視圖以加快查詢的速度,而無須對查詢重新編碼。盡管?UNION?處理速度沒有提高,但每個聚合進程的速度確實提高了。?
?
?
本文結語:
維護索引視圖需要開銷,但可以提高查詢效率。企業版的查詢優化器會自動使用索引視圖。
?
總結
以上是生活随笔為你收集整理的四、物理优化(2)索引视图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享自制的C#和VB Code互转工具
- 下一篇: Lucene 学习笔记(一)