聚集索引设计指南

聚集索引基于数据行的键值在表内排序和存储这些数据行。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。有关聚集索引体系结构的详细信息,请参阅聚集索引结构

每个表几乎都对列定义聚集索引来实现下列功能:

  • 可用于经常使用的查询。
  • 提供高度唯一性。
    ms190639.note(zh-cn,SQL.90).gif注意:
    创建 PRIMARY KEY 约束时,将在列上自动创建唯一索引。默认情况下,此索引是聚集索引,但是在创建约束时,可以指定创建非聚集索引。
  • 可用于范围查询。

如果未使用 UNIQUE 属性创建聚集索引,数据库引擎 将向表自动添加一个四字节 uniqueifier 列。必要时,数据库引擎 将向行自动添加一个 uniqueifier 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。

查询注意事项

在创建聚集索引之前,应先了解数据是如何被访问的。考虑对具有以下特点的查询使用聚集索引:

  • 使用运算符(如 BETWEEN、>、>=、< 和 <=)返回一系列值。
    使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行物理相邻。例如,如果某个查询在一系列销售订单号间检索记录,SalesOrderNumber 列的聚集索引可快速定位包含起始销售订单号的行,然后检索表中所有连续的行,直到检索到最后的销售订单号。
  • 返回大型结果集。
  • 使用 JOIN 子句;一般情况下,使用该子句的是外键列。
  • 使用 ORDER BY 或 GROUP BY 子句。
    在 ORDER BY 或 GROUP BY 子句中指定的列的索引,可以使数据库引擎 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。

列注意事项

一般情况下,定义聚集索引键时使用的列越少越好。考虑具有下列一个或多个属性的列:

  • 唯一或包含许多不重复的值
    例如,雇员 ID 唯一地标识雇员。EmployeeID 列的聚集索引或 PRIMARY KEY 约束将改善基于雇员 ID 号搜索雇员信息的查询的性能。另外,可对 LastNameFirstNameMiddleName 列创建聚集索引,因为经常以这种方式分组和查询雇员记录,而且这些列的组合还可提供高区分度。
  • 按顺序被访问
    例如,产品 ID 唯一地标识 AdventureWorks 数据库的 Production.Product 表中的产品。在其中指定顺序搜索的查询(如 WHERE ProductID BETWEEN 980 and 999)将从 ProductID 的聚集索引受益。这是因为行将按该键列的排序顺序存储。
  • 由于保证了列在表中是唯一的,所以定义为 IDENTITY。
  • 经常用于对表中检索到的数据进行排序。
    按该列对表进行聚集(即物理排序)是一个好方法,它可以在每次查询该列时节省排序操作的成本。

聚集索引不适用于具有下列属性的列:

  • 频繁更改的列
    这将导致整行移动,因为数据库引擎 必须按物理顺序保留行中的数据值。这一点要特别注意,因为在大容量事务处理系统中数据通常是可变的。
  • 宽键
    宽键是若干列或若干大型列的组合。所有非聚集索引将聚集索引中的键值用作查找键。为同一表定义的任何非聚集索引都将增大许多,这是因为非聚集索引项包含聚集键,同时也包含为此非聚集索引定义的键列。

索引选项

创建聚集索引时,可指定若干索引选项。因为聚集索引通常都很大,所以应特别注意下列选项:

  • SORT_IN_TEMPDB
  • DROP_EXISTING
  • FILLFACTOR
  • ONLINE

有关详细信息,请参阅设置索引选项

请参阅

概念

创建聚集索引
创建索引(数据库引擎)
创建和修改 PRIMARY KEY 约束
常规索引设计指南
唯一索引设计指南

帮助和信息

获取 SQL Server 2005 帮助