天天看點

建立索引視圖

SQL Server 2005

<a href="">其他版本               </a>

<a href="http://technet.microsoft.com/zh-cn/library/ms191432(v=sql.105).aspx">SQL Server 2008 R2</a>

<a href="http://technet.microsoft.com/zh-cn/library/ms191432(v=sql.100).aspx">SQL Server 2008</a>

            0(共 2)對本文的評價是有幫助

更新日期:           2006 年 12 月 12 日

在對視圖建立聚集索引之前,該視圖必須符合下列要求: 

當執行 CREATE VIEW 語句時,ANSI_NULLS 和 QUOTED_IDENTIFIER 選項必須設定為 ON。OBJECTPROPERTY 函數通過

ExecIsAnsiNullsOn 或 ExecIsQuotedIdentOn 屬性為視圖報告此資訊。

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

視圖不能引用任何其他視圖,隻能引用基表。

視圖引用的所有基表必須與視圖位于同一資料庫中,并且所有者也與視圖相同。

必須使用 SCHEMABINDING 選項建立視圖。架構綁定将視圖綁定到基礎基表的架構。

必須已使用 SCHEMABINDING 選項建立了視圖引用的使用者定義函數。

表和使用者定義函數必須由視圖中由兩部分組成的名稱引用。不允許由一部分、三部分和四部分組成的名稱引用它們。

建立索引視圖

注意:

引用 SQL Server 2005 中的索引視圖中的 datetime 和 smalldatetime 字元串文字時,建議使用确定性日期格式樣式将文字顯式轉換為所需日期類型。有關确定性日期格式樣式清單,請參閱

datetime 或 smalldatetime 所涉及的表達式被視為具有不确定性,除非相容級别設定為 80 或更低。這是因為結果取決于伺服器會話的 LANGUAGE 和 DATEFORMAT 設定。例如,表達式

<code>CONVERT (datetime, '30 listopad 1996', 113)</code> 的結果取決于 LANGUAGE 設定,因為字元串

<code>listopad</code> 在不同語言中表示不同的月份。同樣,在 <code>DATEADD(mm,3,'2000-12-01')</code> 表達式中,SQL Server 基于 DATEFORMAT 設定解釋

<code>'2000-12-01'</code> 字元串。

非 Unicode 字元資料在排序規則間的隐式轉換也被視為具有不确定性,除非相容級别設定為 80 或更低。

在 90 相容模式下,不允許對包含這些表達式的視圖建立索引。但是,包含已更新資料庫中的這些表達式的現有視圖是可維護的。如果使用索引視圖(其中包含從字元串到日期的隐式轉換),請確定 LANGUAGE 和 DATEFORMAT 的設定在資料庫和應用程式中保持一緻,以避免可能的索引視圖損壞。

如果視圖定義使用聚合函數,SELECT 清單還必須包括 COUNT_BIG (*)。

使用者定義函數的資料通路屬性必須為 NO SQL,外部通路屬性必須是 NO。

公共語言運作時 (CLR) 功能可以出現在視圖的選擇清單中,但不能作為聚集索引鍵定義的一部分。CLR 函數不能出現在視圖的 WHERE 子句中或視圖中的 JOIN 運算的 ON 子句中。

在視圖定義中使用的 CLR 函數和 CLR 使用者定義類型方法必須具有下表所示的屬性設定。

屬性             

注意             

DETERMINISTIC = TRUE

必須顯式聲明為 Microsoft .NET Framework 方法的屬性。

PRECISE = TRUE

必須顯式聲明為 .NET Framework 方法的屬性。

DATA ACCESS = NO SQL

通過将 DataAccess 屬性設定為 DataAccessKind.None 并将

SystemDataAccess 屬性設定為 SystemDataAccessKind.None 來确定。

EXTERNAL ACCESS = NO

對于 CLR 例程,該屬性的預設設定為 NO。

建立索引視圖

我們建議 CLR 例程方法的屬性設定不要與該方法的功能相悖。如果相悖,可能會導緻資料損壞。

視圖中的 SELECT 語句不能包含下列 Transact-SQL 文法元素:

指定列的 * 或 table_name.* 文法。必須明确給出列名。

不能在多個視圖列中指定用作簡單表達式的表列名。如果對列的所有(或除了一個引用之外的所有)引用是複雜表達式的一部分或是函數的一個參數,則可以多次引用該列。例如,下面的 SELECT 清單無效:

<a href="">複制</a>

下面的 SELECT 清單有效: 

在 GROUP BY 子句中使用的列的表達式或基于聚合結果的表達式。

派生表。

公用表表達式 (CTE)。

行集函數。

UNION、EXCEPT 或 INTERSECT 運算符。

子查詢。

外聯接或自聯接。

TOP 子句。

ORDER BY 子句。

DISTINCT 關鍵字。

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

AVG、MAX、MIN、STDEV、STDEVP、VAR 或 VARP 聚合函數。如果在引用索引視圖的查詢中指定了 AVG(expression),則當視圖 SELECT 清單中包含 SUM(expression) 和 COUNT_BIG(expression) 時,優化器可經常計算所需結果。例如,索引視圖 SELECT 清單不能包含表達式 AVG(column1)。如果視圖 SELECT 清單包含表達式 SUM(column1) 和 COUNT_BIG(column1),則

SQL Server 可以計算引用視圖并指定 AVG(column1) 的查詢的平均數。

引用可為空表達式的 SUM 函數。

包括排名或聚合視窗函數的 OVER 子句。

CLR 使用者定義聚合函數。

全文謂詞 CONTAINS 或 FREETEXT。

COMPUTE 或 COMPUTE BY 子句。

CROSS APPLY 或 OUTER APPLY 運算符。

PIVOT 或 UNPIVOT 運算符。

表提示(僅應用于 90 或更高的相容級别)。

聯接提示。

對 Xquery 表達式的直接引用。可以接受間接引用,例如位于綁定到架構的、使用者定義的函數内部的 Xquery 表達式。

指定 GROUP BY 後,視圖 SELECT 清單必須包含 COUNT_BIG(*) 表達式,并且視圖定義不能指定 HAVING、CUBE 或 ROLLUP。

<a href="">CREATE INDEX 語句的要求</a>

<a></a>

對視圖建立的第一個索引必須是唯一聚集索引。建立唯一聚集索引後,可以建立其他非聚集索引。視圖的索引命名約定與表的索引命名約定相同。唯一的差別是表名替換為視圖名。有關詳細資訊,請參閱

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 子句中指定的列。

構成索引鍵列值的不精确表達式必須引用視圖下基表中的存儲列。該列可以是正常存儲列,也可以是持久化計算列。其他不精确表達式不能作為索引視圖的鍵列的一部分。

<a href="">注意事項</a>

索引視圖中列的 large_value_types_out_of_row 選項的設定繼承的是基表中相應列的設定。此值是使用

若删除視圖,該視圖的所有索引也将被删除。若删除聚集索引,視圖的所有非聚集索引和自動建立的統計資訊也将被删除。視圖中使用者建立的統計資訊受到維護。非聚集索引可以分别删除。删除視圖的聚集索引将删除存儲的結果集,并且優化器将重新像處理标準視圖那樣處理視圖。

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

若要向現有系統中的視圖添加索引,必須架構綁定任何要放置索引的視圖。您可以執行下列操作: 

删除視圖并通過指定 WITH SCHEMABINDING 重新建立視圖。

建立另一個視圖,使其具有與現有視圖相同的文本,僅名稱不同。優化器将考慮新視圖的索引,即使查詢的 FROM 子句中沒有直接引用它。

建立索引視圖

不能删除參與到使用 SCHEMABINDING 子句建立的視圖中的視圖或表,除非建立的視圖已被删除或更改而不再具有架構綁定。此外,如果 ALTER TABLE 語句會影響視圖定義,則對參與具有架構綁定的視圖的表執行這些語句将失敗。

必須確定新視圖符合索引視圖的所有要求。這可能需要更改視圖及其所引用的所有基表的所有權,以便它們屬于同一使用者。

<a href="">示例</a>

以下示例将建立一個視圖并為該視圖建立索引。包含兩個使用該索引視圖的查詢。