有多个表连接的视图能不能建索引视图?如果能的话,是怎么建的,有什么标准??

解决方案 »

  1.   

    在视图上创建聚集索引之前,该视图必须满足下列要求: 当执行 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 AddColAColBSELECT 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 子句中指定的列。
      

  2.   

    ---创建索引视图需要注意的几点
    1. 创建索引视图的时候需要指定表所属的架构
    --错误写法
    create view v_f with schemabinding 
    as
    select
       a.a,a.b,b.a,b.b
    from
       a join b 
    on
       a.id=b.id
    go---正确写法:
    create view v_f with schemabinding 
    as
    select
       *
    from
       dbo.a join dbo.b 
    on
       a.id=b.id
    go
    2.在创建索引视图的select语句时,不使用*,必须指定具体的列名
    --错误写法
    create view v_f with schemabinding 
    as
    select
       a.a,a.b,b.a,b.b
    from
       dbo.a join dbo.b 
    on
       a.id=b.id
    go---正确写法
    create view v_f with schemabinding 
    as
    select
       a.a,a.b,b.a,b.b
    from
       dbo.a join dbo.b 
    on
       a.id=b.id
    go3.在创建索引视图的select 语句中,不能存在重复的列名,这个不举例了4. 只能为索引视图创建唯一聚集索引
    --正确的写法
    create unique clustered index ix_uniquetb on v_tb
    go--错误的写法 
    create clustered index ix_uniquetb on v_tb
    go本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fredrickhu/archive/2010/01/12/5183068.aspx
      

  3.   

    ---创建索引视图需要注意的几点
    1. 创建索引视图的时候需要指定表所属的架构
    --错误写法
    create view v_f with schemabinding 
    as
    select
       a.a,a.b,b.a,b.b
    from
       a join b 
    on
       a.id=b.id
    go---正确写法:
    create view v_f with schemabinding 
    as
    select
       *
    from
       dbo.a join dbo.b 
    on
       a.id=b.id
    go
    2.在创建索引视图的select语句时,不使用*,必须指定具体的列名
    --错误写法
    create view v_f with schemabinding 
    as
    select
       a.a,a.b,b.a,b.b
    from
       dbo.a join dbo.b 
    on
       a.id=b.id
    go---正确写法
    create view v_f with schemabinding 
    as
    select
       a.a,a.b,b.a,b.b
    from
       dbo.a join dbo.b 
    on
       a.id=b.id
    go3.在创建索引视图的select 语句中,不能存在重复的列名,这个不举例了4. 只能为索引视图创建唯一聚集索引
    --正确的写法
    create unique clustered index ix_uniquetb on v_tb
    go--错误的写法 
    create clustered index ix_uniquetb on v_tb
    go本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fredrickhu/archive/2010/01/12/5183068.aspx