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 = fillfactorFILLFACTOR 称为填充因子,它指定创建索引时,每个索引页的数据占索引页大小的百分比,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 子句的UPDATESTATISTICS 命令。 SORT_IN_TEMPDB指定用于创建索引的分类排序结果将被存储到Tempdb 数据库中。如果Tempdb 数据库和用户数据库位于不同的磁盘设备上,那么使用这一选项可以减少创建索引的时间,但它会增加创建索引所需的磁盘空间。 ON filegroup指定存放索引的文件组。 注意:数据类型为TEXT、NTEXT、IMAGE或BIT的列不能作为索引的列。 由于索引的宽度不能超过900个字节,因此数据类型为CHAR、VARCHAR、BINARY和VARBINARY的列的列宽 度超过了900字节,或数据类型为NCHAR、NVARCHAR的列的列宽度超过了450个字节时也不能作为索引的列。 在使用索引创建向导创建索引时,不能将计算列包含在索引中,但在直接创建或使用CREATE INDEX命令创建索引时,则可以对计算机列创建索引,这在SQL Server2000以前的版本中是不允许的,算得上是一大改进。例8-1: 为表products 创建一个簇索引。create unique clustered index pk_p_idon products(p_id)withpad_index,fillfactor = 10,ignore_dup_key,drop_existing,statistics_norecomputeon [primary]例8-2 为表products 创建一个复合索引create index pk_p_mainon products(p_id, p_name, sumvalue) --其中sumvalue 是一个计算列表达式为price*quantitywithpad_index,fillfactor = 50on [primary]例8-3 创建一个视图并为它建一个索引create view dbo.work_yearswithschemabindingasselect top 100 percent emp_id,e_name, birthday, hire_date, year(getdate())- year(hire_date) as work_yearsfrom dbo.employeeorder by work_years desccreate unique clusteredindex emp_id_view on dbo.work_years (emp_id) 8.2.2 用Enterprise Manager 创建索引。在Enterprise Manager 中创建索引有两种方法1 用索引创建向导创建索引创建方法如下:(1) 在目录树中选择要创建索引的表所在的数据库,点击任务板中的向导页面“Wizards”,出现如图8-2 所示的选择向导界面。图8-2 选择索引创建向导(2) 单击任务板中的“Create an Index” 链接,出现如图8-3 所示的索引创建向导界面。也可以从“Tools ”菜单中选择“izards” 菜单项,则出现如图5-17 所示的选择SQL Server 向导对话框,再从树型目录中选择“Database”下的“Create Index Wizard”选项,也会出现如图8-3 所示的索引创建向导界面。(3) 单击“下一步”按钮,出现如图8-4 所示的界面,从中选择要创建索引的表,及其所属的数据库。(4) 单击“下一步”按钮,出现如图8-5 所示的界面,它显示了所选择的表中已经存在的索引的信息。如果表还没有创建过索引,则不会出现此界面,而直接出现如图8-6 所示的界面。(5) 单击“下一步”按钮,出现如图8-6 所示的界面,它列出了表中的所有列的信息,从中选择创建索引的列。(6) 单击“下一步”按钮,出现如图8-7 所示的界面,它列出了可供选择的索引设置选项(有关索引选项的设置,请参考前面讲述的CREATE INDEX 命令)。
(7) 单击“下一步”按钮,出现如图8-8 所示的完成索引创建界面,在此可以指定所创建索引的名称,还可以调整组成索引的列的顺序。单击“完成”按钮,结束索引创建过程。系统会弹出一个创建索引成功信息对话框。 2 直接创建索引选择要创建索引的表,单击右键,从快捷菜单中选择“所有任务(All Tasks)”子菜单中的“Manage Indexes”选项,将会出现如图8-9 所示的索引管理对话框,其中列出了表中已经存在的索引。选择“New” 按钮,进入如图8-10 所示的创建索引对话框。在图8-10中,输入要创建的索引的名称,再选择用于创建索引的列,并设置索引的各种选项(有关索引选项的设置,请参考前面讲述的CREATE INDEX 命令)。单击“OK” 按钮,完成索引的创建。