更新日期: 2006 年 12 月 12 日
在对视图创建聚集索引之前,该视图必须符合下列要求:
![]() |
---|
引用 SQL Server 2005 中的索引视图中的 datetime 和 smalldatetime 字符串文字时,建议使用确定性日期格式样式将文字显式转换为所需日期类型。有关确定性日期格式样式列表,请参阅 CAST 和 CONVERT (Transact-SQL)。将字符串隐式转换为 datetime 或 smalldatetime 所涉及的表达式被视为具有不确定性,除非兼容级别设置为 80 或更低。这是因为结果取决于服务器会话的 LANGUAGE 和 DATEFORMAT 设置。例如,表达式 CONVERT (datetime, '30 listopad 1996', 113) 的结果取决于 LANGUAGE 设置,因为字符串 listopad 在不同语言中表示不同的月份。同样,在 DATEADD(mm,3,'2000-12-01') 表达式中,SQL Server 基于 DATEFORMAT 设置解释 '2000-12-01' 字符串。
|
属性 | 注意 |
---|---|
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 ColumnA, ColumnB, ColumnA
SELECT SUM(ColumnA) AS SumColA, ColumnA % ColumnB AS ModuloColAColB, COUNT_BIG(*) AS cBig FROM dbo.T1 GROUP BY ModuloColAColB
对视图创建的第一个索引必须是唯一聚集索引。创建唯一聚集索引后,可以创建其他非聚集索引。视图的索引命名约定与表的索引命名约定相同。唯一的区别是表名替换为视图名。有关详细信息,请参阅 CREATE INDEX (Transact-SQL)。
CREATE INDEX 除了符合 CREATE INDEX 的常规要求之外,还必须符合下列要求:
索引视图中列的 large_value_types_out_of_row 选项的设置继承的是基表中相应列的设置。此值是使用 sp_tableoption 设置的。由表达式组成的列的默认设置为 0。这意味着大值类型存储在行内。有关详细信息,请参阅使用大值数据类型。
创建聚集索引后,对于任何尝试修改视图基本数据的连接,其选项设置必须与创建索引所需的选项设置相同。如果执行语句的连接的选项设置不正确,则 SQL Server 将生成错误,并回滚任何会影响视图结果集的 INSERT、UPDATE 或 DELETE 语句。有关详细信息,请参阅影响结果的 SET 选项。
若删除视图,该视图的所有索引也将被删除。若删除聚集索引,视图的所有非聚集索引和自动创建的统计信息也将被删除。视图中用户创建的统计信息受到维护。非聚集索引可以分别删除。删除视图的聚集索引将删除存储的结果集,并且优化器将重新像处理标准视图那样处理视图。
尽管 CREATE UNIQUE CLUSTERED INDEX 语句仅指定组成聚集索引键的列,但视图的完整结果集将存储在数据库中。与基表的聚集索引一样,聚集索引的 B 树结构仅包含键列,但数据行包含视图结果集中的所有列。
若要向现有系统中的视图添加索引,必须架构绑定任何要放置索引的视图。您可以执行下列操作:
![]() |
---|
不能删除参与到使用 SCHEMABINDING 子句创建的视图中的视图或表,除非创建的视图已被删除或更改而不再具有架构绑定。此外,如果 ALTER TABLE 语句会影响视图定义,则对参与具有架构绑定的视图的表执行这些语句将失败。
|
必须确保新视图符合索引视图的所有要求。这可能需要更改视图及其所引用的所有基表的所有权,以便它们属于同一用户。
可以禁用表和视图的索引。禁用表的聚集索引时,与该表关联的视图的索引也将被禁用。有关详细信息,请参阅禁用索引。
以下示例将创建一个视图并为该视图创建索引。包含两个使用该索引视图的查询。
USE AdventureWorks;GO--Set the options to support indexed views.SET NUMERIC_ROUNDABORT OFF;SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON;GO--Create view with schemabinding.IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULLDROP VIEW Sales.vOrders ;GOCREATE VIEW Sales.vOrdersWITH SCHEMABINDINGAS SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Revenue, OrderDate, ProductID, COUNT_BIG(*) AS COUNT FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS o WHERE od.SalesOrderID = o.SalesOrderID GROUP BY OrderDate, ProductID;GO--Create an index on the view.CREATE UNIQUE CLUSTERED INDEX IDX_V1 ON Sales.vOrders (OrderDate, ProductID);GO--This query can use the indexed view even though the view is --not specified in the FROM clause.SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Rev, OrderDate, ProductIDFROM Sales.SalesOrderDetail AS od JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID=o.SalesOrderID AND ProductID BETWEEN 700 and 800 AND OrderDate >= CONVERT(datetime,'05/01/2002',101)GROUP BY OrderDate, ProductIDORDER BY Rev DESC;GO--This query can use the above indexed view.SELECT OrderDate, SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS RevFROM Sales.SalesOrderDetail AS od JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID=o.SalesOrderID AND DATEPART(mm,OrderDate)= 3 AND DATEPART(yy,OrderDate) = 2002GROUP BY OrderDateORDER BY OrderDate ASC;GO
联系客服