为什么在视图上只能建立唯一的聚集索引?

解决方案 »

  1.   

    视图索引
    Microsoft® SQL Server™ 2000 支持在视图上定义索引。视图有时也称为虚拟表,这是由于视图返回的结果集与包含行和列的表具有相同的常规格式,并且在 SQL 语句中可以相同的方式引用视图和表。非索引视图的结果集不永久存储在数据库中。每当查询引用视图时,SQL Server 便动态地将生成视图结果集所需的逻辑合并到由基表中的数据生成完整的查询结果集所需的逻辑中。生成视图结果的过程称为视图具体化。有关更多信息,请参见视图解析。对于涉及对大量的行进行复杂处理的非索引视图,为引用视图的每个查询动态生成结果集的开销会很大。这类视图包括聚集大量数据或联接许多行的视图。若经常在查询中引用这类视图,可通过在视图上创建唯一聚集索引来提高性能。在视图上创建唯一聚集索引时将执行该视图,并且结果集在数据库中的存储方式与带聚集索引的表的存储方式相同。有关用于存储聚集索引的结构的更多信息,请参见聚集索引。在视图上创建索引的另一个好处是:查询优化器开始在查询中使用视图索引,而不是直接在 FROM 子句中命令视图。这样一来,可从索引视图检索数据而无需重新编码,由此带来的高效率也使现有查询获益。在视图上创建聚集索引可存储创建索引时生成的结果集。索引视图还自动反映自创建索引后对基表数据所做的更改,这一点与在基表上创建的索引相同。当对基表中的数据进行更改时,索引视图中存储的数据也反映数据更改。视图的聚集索引必须唯一,从而提高了 SQL Server 在索引中查找受任何数据更改影响的行的效率。必须设置特定的 SET 选项后才能在视图上创建索引。只有当执行语句的连接具有相同的选项设置时,查询优化器才考虑对后续 SQL 语句使用索引。有关更多信息,请参见影响结果的 SET 选项。与基表上的索引相比,对索引视图的维护可能更复杂。只有当提高的视图结果检索速度超过了修改所需的开销时,才应在视图上创建索引。这样的视图通常包括映射在相对静态的数据上、处理多行以及由许多查询引用的视图。在视图上创建的第一个索引必须是唯一聚集索引。在创建唯一聚集索引后,可创建其它非聚集索引。视图上的索引命名规则与表上的索引命名规则相同。唯一区别是表名由视图名替换。若除去视图,视图上的所有索引也将被除去。若除去聚集索引,视图上的所有非聚集索引也将被除去。可分别除去非聚集索引。除去视图上的聚集索引将删除存储的结果集,并且优化器将重新像处理标准视图那样处理视图。尽管 CREATE UNIQUE CLUSTERED INDEX 语句仅指定组成聚集索引键的列,但视图的完整结果集将存储在数据库中。与基表上的聚集索引一样,聚集索引的 B 树结构仅包含键列,但数据行包含视图结果集中的所有列。