1. 程式人生 > >SQL Server:建立索引檢視

SQL Server:建立索引檢視

檢視也稱為虛擬表,這是因為由檢視返回的結果集其一般格式與由列和行組成的表相似,並且,在 SQL 語句中引用檢視的方式也與引用表的方式相同。標準檢視的結果集不是永久地儲存在資料庫中。查詢每次引用檢視時,Microsoft® SQL Server™ 2000 會動態地將生成檢視結果集所需的邏輯合併到從基表資料生成完整查詢結果集所需的邏輯中。生成檢視結果的過程稱為檢視具體化。有關更多資訊,請參見檢視解析。

對於標準檢視而言,為每個引用檢視的查詢動態生成結果集的開銷很大,特別是對於那些涉及對大量行進行復雜處理(如聚合大量資料或聯接許多行)的檢視更為可觀。若經常在查詢中引用這類檢視,可通過在檢視上建立唯一聚集索引來提高效能。在檢視上建立唯一聚集索引時將執行該檢視,並且結果集在資料庫中的儲存方式與帶聚集索引的表的儲存方式相同。

說明 只有安裝了 Microsoft SQL Server 2000 企業版或 Microsoft SQL Server 2000 開發版,才可以建立索引檢視。

在檢視上建立索引的另一個好處是:查詢優化器開始在查詢中使用檢視索引,而不是直接在 FROM 子句中命名檢視。這樣一來,可從索引檢視檢索資料而無需重新編碼,由此帶來的高效率也使現有查詢獲益。有關更多資訊,請參見在檢視上使用索引。

在檢視上建立聚集索引可儲存建立索引時存在的資料。索引檢視還自動反映自建立索引後對基表資料所做的更改,這一點與在基表上建立的索引相同。當對基表中的資料進行更改時,索引檢視中儲存的資料也反映資料更改。檢視的聚集索引必須唯一,從而提高了 SQL Server 在索引中查詢受任何資料更改影響的行的效率。

與基表上的索引相比,對索引檢視的維護可能更復雜。只有當檢視的結果檢索速度的效益超過了修改所需的開銷時,才應在檢視上建立索引。這樣的檢視通常包括對映到相對靜態的資料上、處理多行以及由許多查詢引用的檢視。

檢視的要求
在檢視上建立聚集索引之前,該檢視必須滿足下列要求:

當執行 CREATE VIEW 語句時,ANSI_NULLS 和 QUOTED_IDENTIFIER 選項必須設定為 ON。OBJECTPROPERTY 函式通過 ExecIsAnsiNullsOn 或 ExecIsQuotedIdentOn 屬性為檢視報告此資訊。

為執行所有 CREATE TABLE 語句以建立檢視引用的表,ANSI_NULLS 選項必須設定為 ON。

檢視不能引用任何其它檢視,只能引用基表。

檢視引用的所有基表必須與檢視位於同一個資料庫中,並且所有者也與檢視相同。

必須使用 SCHEMABINDING 選項建立檢視。SCHEMABINDING 將檢視繫結到基礎基表的架構。

必須已使用 SCHEMABINDING 選項建立了檢視中引用的使用者定義的函式。

表和使用者定義的函式必須由 2 部分的名稱引用。不允許使用 1 部分、3 部分和 4 部分的名稱。

檢視中的表示式所引用的所有函式必須是確定性的。OBJECTPROPERTY 函式的 IsDeterministic 屬性報告使用者定義的函式是否是確定性的。有關更多資訊,請參見確定性函式和非確定性函式。

檢視中的 SELECT 語句不能包含下列 Transact-SQL 語法元素:
選擇列表不能使用 * 或 table_name.* 語法指定列。必須顯式給出列名。

不能在多個檢視列中指定用作簡單表示式的表的列名。如果對列的所有(或只有一個例外)引用是複雜表示式的一部分或是函式的一個引數,則可多次引用該列。例如,下列選擇列表是非法的:
SELECT ColumnA, ColumnB, ColumnA

下列選擇列表是合法的:

SELECT ColumnA, AVG(ColumnA), ColumnA + Column B AS AddColAColB

SELECT SUM(ColumnA), ColumnA % ColumnB AS ModuloColAColB

派生表。

行集函式。

UNION 運算子。

子查詢。

外聯接或自聯接。

TOP 子句。

ORDER BY 子句。

DISTINCT 關鍵字。

COUNT(*)(允許 COUNT_BIG(*)。)

AVG、MAX、MIN、STDEV、STDEVP、VAR 或 VARP 聚合函式。如果在引用索引檢視的查詢中指定 AVG、MAX、MIN、STDEV、STDEVP、VAR 或 VARP,如果檢視選擇列表包含以下替換函式,則優化器會經常計算需要的結果。 複雜聚合函式 替代簡單聚合函式
AVG(X)
SUM(X), COUNT_BIG(X)

STDEV(X)
SUM(X), COUNT_BIG(X), SUM(X**2)

STDEVP(X)
SUM(X), COUNT_BIG(X), SUM(X**2)

VAR(X)
SUM(X), COUNT_BIG(X), SUM(X**2)

VARP(X)
SUM(X), COUNT_BIG(X), SUM(X**2)


例如,索引檢視選擇列表不能包含表示式 AVG(SomeColumn)。如果檢視選擇列表包含表示式 SUM(SomeColumn) 和 COUNT_BIG(SomeColumn),則 SQL Server 可為引用檢視並指定 AVG(SomeColumn) 的查詢計算平均數。

引用可為空的表示式的 SUM 函式。
全文謂詞 CONTAINS 或 FREETEXT。
COMPUTE 或 COMPUTE BY 子句。
如果沒有指定 GROUP BY,則檢視選擇列表不能包含聚合表示式。
如果指定了 GROUP BY,則檢視選擇列表必須包含 COUNT_BIG(*) 表示式,並且,檢視定義不能指定 HAVING、CUBE 或 ROLLUP。
通過一個既可以取值為 float 值也可以使用 float 表示式求值的表示式而生成的列不能作為索引檢視或表的索引的鍵。
CREATE INDEX 語句的要求
在檢視上建立的第一個索引必須是唯一聚集索引。在建立唯一聚集索引後,可建立其它非聚集索引。檢視上的索引命名規則與表上的索引命名規則相同。唯一區別是表名由檢視名替換。有關更多資訊,請參見 CREATE INDEX。

除了一般的 CREATE INDEX 要求外,CREATE INDEX 語句還必須滿足下列要求:

執行 CREATE INDEX 語句的使用者必須是檢視的所有者。
當執行 CREATE INDEX 語句時,下列 SET 選項必須設定為 ON:
ANSI_NULLS
ANSI_PADDING
ANSI_WARNINGS
ARITHABORT
CONCAT_NULL_YIELDS_NULL
QUOTED_IDENTIFIERS
必須將選項 NUMERIC_ROUNDABORT 選項設定為 OFF。
檢視不能包含 text、ntext 或 image 列,即使在 CREATE INDEX 語句中沒有引用它們。
如果檢視定義中的 SELECT 語句指定了一個 GROUP BY 子句,則唯一聚集索引的鍵只能引用在 GROUP BY 子句中指定的列。
注意事項
建立聚集索引後,對於任何試圖為檢視修改基本資料而進行的連線,其選項設定必須與建立索引所需的選項設定相同。如果這個執行語句的連線沒有適當的選項設定,則 SQL Server 生成錯誤並回滾任何會影響檢視結果集的 INSERT、UPDATE 或 DELETE 語句。有關更多資訊,請參見影響結果的 SET 選項。

若除去檢視,檢視上的所有索引也將被除去。若除去聚集索引,檢視上的所有非聚集索引也將被除去。可分別除去非聚集索引。除去檢視上的聚集索引將刪除儲存的結果集,並且優化器將重新象處理標準檢視那樣處理檢視。

儘管 CREATE UNIQUE CLUSTERED INDEX 語句僅指定組成聚集索引鍵的列,但檢視的完整結果集將儲存在資料庫中。與基表上的聚集索引一樣,聚集索引的 B 樹結構僅包含鍵列,但資料行包含檢視結果集中的所有列。

若想為現有系統中的檢視新增索引,必須計劃繫結任何想要放入索引的檢視。可以:

除去檢視並通過指定 WITH SCHEMABINDING 重新建立它。
建立另一個檢視,使其具有與現有檢視相同的文字,但是名稱不同。優化器將考慮新檢視上的索引,即使在查詢的 FROM 子句中沒有直接引用它。

說明 不能除去參與到用 SCHEMABINDING 子句建立的檢視中的表或檢視,除非該檢視已被除去或更改而不再具有架構繫結。另外,如果對參與具有架構繫結的檢視的表執行 ALTER TABLE 語句,而這些語句又會影響檢視定義,則這些語句將會失敗。

必須確保新檢視滿足索引檢視的所有要求。這可能需要更改檢視及其所引用的所有基表的所有權,以便它們都為同一使用者所擁有。