8.2.1 用CREATE INDEX 命令创建索引 CREATE INDEX 既可以创建一个可改变表的物理顺序的簇索引,也可以创建提高查询性能的非簇索引。其语法如下: CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_name ON {table | view } column [ ASC | DESC ] [,...n]) [WITH [PAD_INDEX] [ [, ] FILLFACTOR = fillfactor] [ [, ] IGNORE_DUP_KEY] [ [, ] DROP_EXISTING] [ [, ] STATISTICS_NORECOMPUTE] [ [, ] SORT_IN_TEMPDB ] ] [ON filegroup] 各参数说明如下:
- UNIQUE
创建一个惟一索引,即索引的键值不重复。在列包含重复值时,不能建惟一索引。如要使用此选项,则应确定索引所包含的列均不允许NULL 值,否则在使用时会经常出错。
- CLUSTERED
指明创建的索引为簇索引。如果此选项缺省,则创建的索引为非簇索引。
- NONCLUSTERED
指明创建的索引为非簇索引其索引。数据页中包含了指向数据库中实际的表数据页的指针。
- index_name
指定所创建的索引的名称。索引名称在一个表中应是惟一的,但在同一数据库或不同数据库中可以重复。
- table
指定创建索引的表的名称。必要时还应指明数据库名称和所有者名称。
- view
指定创建索引的视图的名称。视图必须是使用SCHEMABINDING 选项定义过的,其具体信息请参见“视图创建”章节。
- ASC | DESC
指定特定的索引列的排序方式。默认值是升序(ASC)。
- column
指定被索引的列。如果使用两个或两个以上的列组成一个索引,则称为复合索引。一个索引中最多可以指定16 个列,但列的数据类型的长度和不能超过900 个字节。
- PAD_INDEX
指定填充索引的内部节点的行数,至少应大于等于两行。PAD_INDEX 选项只有在FILLFACTOR 选项指定后才起作用。因为PAD_INDEX 使用与FILLFACTOR 相同的百分比。缺省时,SQL Server 确保每个索引页至少有能容纳一条最大索引行数据的空闲空间。如果FILLFACTOR 指定的百分比不够容纳一行数据S,QL Server 会自动内部更改百分比。
- FILLFACTOR = fillfactor
FILLFACTOR 称为填充因子,它指定创建索引时,每个索引页的数据占索引页大小的百分比,fillfactor 的值为1 到100。它其实同时指出了索引页保留的自由空间占索引页大小的百分比。即100 - fillfactor。 对于那些频繁进行大量数据插入或删除的表在建索引时应该为将来生成的索引数据预留较大的空间,即将fillfactor 设得较小,否则,索引页会因数据的插入而很快填满,并产生分页,而分页会大大增加系统的开销。但如果设得过小,又会浪费大量的磁盘空间,降低查询性能。因此,对于此类表通常设一个大约为10 的fillfactor。 而对于数据不更改的、高并发的、只读的表,fillfactor 可以设到95 以上乃至100。
如果没有指定此选项,SQL Server 默认其值为0 。0 是个特殊值,与其它小FILLFACTOR 值(如:1,2)的意义不同,其叶节点页被完全填满,而在索引页中还有一些空间。可以 用存储过程Sp_configure 来改变默认的FILLFACTOR 值。
- IGNORE_DUP_KEY
此选项控制了当往包含于一个惟一约束中的列中插入重复数据时SQL Server 所作的反应。当选择此选项时,SQL Server 返回一个错误信息,跳过此行数据的插入,继续执行下面的插入数据的操作:当没选择此选项时,SQL Server 不仅会返回一个错误信息,还会回滚(Rolls Back)整个INSERT 语句(关于回滚,请参见“数据库更新”章节中的“事务”一节)。
- DROP_EXISTING
指定要删除并重新创建簇索引。删除簇索引会导致所有的非簇索引被重建,因为需要用行指针来替换簇索引键。如果再重建簇索引,那么非簇索引又会再重建一次,以便用簇索引键来替换行指针。使用DROP_EXISTING 选项可以使非簇索引只重建一次。
- STATISTICS_NORECOMPUTE
指定分布统计不自动更新。需要手动执行不带NORECOMPUTE 子句的UPDATESTAT |