大型数据库管理系统技术、应用与实例分析:SQL Server 2005
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

6.2 索引类型

索引类型按不同的需求和分法可分为:聚集索引和非聚集索引、主键索引和普通索引、唯一索引和非唯一索引以及单列索引和复合索引。

6.2.1 聚集索引和非聚集索引

在聚集索引中,如上所述,行的物理存储顺序与索引顺序完全相同,每个表只允许建立一个聚集索引。而非聚集索引不改变表中数据行的物理存储顺序。由于建立聚集索引随时要改变表中数据行的物理顺序,所以应在其他非聚集索引建立之前建立聚集索引,以免引起SQL Server重新构造非聚集索引。使用聚集索引检索数据要比非聚集索引快。在默认情况下,SQL Server为主键约束建立的索引为聚集索引,但这一默认设置可以使用NONCLUSTERED关键字改变。同样,在默认情况下,SQL Server为UNIQUE约束所建立的索引为非聚集索引,这一默认设置可以使用CLUSTERED关键字改变。在CREATE INDEX语句中,使用CLUSTERED选项可以建立聚集索引。聚集索引可以使用NONCLUSTERED关键字改变为非聚集索引。一个表最多可以建立249个非聚集索引。

6.2.2 主键索引和非主键索引

表定义主键时自动创建主键索引,并且会自动创建聚集索引。在创建聚集索引时,可以指定填充因子,以便在索引页上留出额外的间隙,保留一定百分比的空间,供将来表的数据行增加或更新时减少发生页拆分的机会。填充因子的值是从0到100的百分比数值,值为100时表示页将填满,留出的存储空间量最小,只有当不会对数据进行更改时才会使用此设置。填充因子的默认值为0,值越小则数据页上的空闲空间越大,这样可以减少在索引增长过程中对页进行拆分的需要。

频繁更改的属性列上不适宜创建主键聚集索引,因为SQL Server要求必须按照这些属性列的值重新安排记录的物理顺序,这将导致记录的物理移动。非主键索引是在非主键的属性列上创建的索引,这些索引一般都是非聚集索引,除非主键索引通过NONCLUSTERED关键字改变为非聚集索引,才可以在某个非主键列上创建聚集索引。

6.2.3 唯一索引和非唯一索引

唯一索引可以确保索引列中不包含重复值。只有当唯一性是数据本身特征时,指定唯一索引才有意义。使用唯一索引不能完全等同于使用主键。如果某列包含多行NULL值,则不能在该列上创建唯一索引。在CREATE TABLE或ALTER TABLE语句中设置PRIMARY KEY约束或UNIQUE约束时,SQL Server自动为这些约束创建唯一索引;在CREATE INDEX语句中使用UNIQUE选项也可创建唯一索引。

在使用CREATE INDEX语句对一个已经存在的表创建唯一索引时,系统首先检查表中已有的数据,如果被索引的列存在重复键值,系统将停止建立索引,这时SQL Server将显示一条错误信息,并列出重复数据。在这种情况下,只有删除已经存在的重复后,才能对这些列建立唯一索引。数据表创建唯一索引后,SQL Server将禁止INSERT语句和UPDATE语句向表中添加重复的键值行。

6.2.4 单列索引和复合索引

单列索引是指对表中单个列建立索引。多数情况下,单列索引是创建索引首选考虑的索引,因为单列索引代价相对较小,而对数据库查询效能提高很大。而一个索引中包含了一个以上的列称为复合索引,最多可以有16个列复合到一个索引中,并且这些列必须位于同一个表中,复合的多列索引允许某一列具有相同的值。复合索引值的最大长度为900字节。例如,不可在定义为char(300)、char(300)和char(301)的三个列上创建单个索引,因为总宽度超过了900字节。

在使用复合索引检索时,把被索引的列作为一个单位。复合索引中的列顺序可以和表中的列顺序不同。在复合索引中应该首先定义最可能具有唯一性的属性列。