创建聚集索引
除了个别表之外,每个表都应该有聚集索引。聚集索引除了可以提高查询性能之外,还可以按需重新生成或重新组织来控制表碎片。也可以对视图创建聚集索引。
典型实现
聚集索引按下列方式实现:
- PRIMARY KEY 和 UNIQUE 约束
在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创建唯一聚集索引。主键列不允许空值。
在创建 UNIQUE 约束时,默认情况下将创建唯一非聚集索引,以便强制 UNIQUE 约束。如果不存在该表的聚集索引,则可以指定唯一聚集索引。
将索引创建为约束的一部分后,会自动将索引命名为与约束名称相同的名称。有关详细信息,请参阅PRIMARY KEY 约束和UNIQUE 约束。 - 独立于约束的索引
指定非聚集主键约束后,您可以对非主键列的列创建聚集索引。 - 索引视图
若要创建索引视图,请对一个或多个视图列定义唯一聚集索引。视图将具体化,并且结果集存储在该索引的页级别中,其存储方式与表数据存储在聚集索引中的方式相同。有关详细信息,请参阅创建索引视图。
键列选择
因为每个表只能有一个聚集索引,所以确定对哪些列创建聚集索引是非常重要的。有关选择正确的列的详细信息,请参阅聚集索引设计指南。
聚集索引的索引键不能包含在ROW_OVERFLOW_DATA 分配单元中具有现有数据的 varchar 列。如果对 varchar 列创建了聚集索引,并且在 IN_ROW_DATA 分配单元中存在现有数据,则对该列执行的将数据推送到行外的后续插入或更新操作将会失败。有关分配单元的详细信息,请参阅表组织和索引组织。
磁盘空间要求
创建聚集索引结构后,旧(源)结构和新(目标)结构的各自的文件和文件组都需要磁盘空间。在完成事务提交后,才会释放旧结构。排序也需要其他临时磁盘空间。有关详细信息,请参阅确定索引的磁盘空间要求。
性能注意事项
如果对具有多个现有非聚集索引的堆创建聚集索引,则必须重新生成所有非聚集索引,以使它们包含聚集键值而非行标识符 (RID)。同样,如果删除具有多个非聚集索引的表的聚集索引,在 DROP 操作过程中,将重新生成非聚集索引。对于大型表,这可能需要很长时间。
对大型表创建索引的首选方法是先创建聚集索引,然后创建任何非聚集索引。在对现有表创建索引时,请考虑将 ONLINE 选项设置为 ON。如果设置为 ON,则不会持有长期表锁。这使对基础表的查询或更新可以继续进行。有关详细信息,请参阅联机执行索引操作。