CREATE INDEX语法
通过T-SQL创建索引,就像创建表一样容易。在本节中,我们只看看如何给表创建索引,尽管在SQL Server中,还可以给另一种被称作视图的对象创建索引。
创建索引的完整语法没有在这里列出,不过你可以在SQL Server的联机丛书中找到对它的详细描述。在学习SQL Server 2008的时候,使用其简化版本就已经足够了。大多数情况下,创建索引可以采用下面的版本:
promoted
让我们对该删节版本语句中的选项进行逐一的介绍。
CREATE。必填。该关键字通知SQL Server要构建一个新的对象。
UNIQUE。可选。该选项用于通知SQL Server索引中列出的列的值是每行唯一的。如果试图
插入重复的行,则该选项会强制SQL Server返回一个错误信息。
CLUSTERED或NONCLUSTERED。可选。如果这两个选项都没有被明确列出,则默认将索引创建为NONCLUSTERED(非聚集索引)。
INDEXjoyes。必填。该选项用于通知SQL Server要创建的新对象是一个索引。
Index_name。必填。这是要创建的索引的名称。该名称在表中必须是唯一的,也建议在整个数据库中保持该名称的唯一性,在前面的相关讨论中,我们使用了"IX_表名_列名"的这种命名方法。
ON table。必填。这是同索引相关联的表的名称。只能是一个表的名称。
column。必填。这是在索引中所包含的列的名称。可以是一个列,也可以是多个列。如果是多个列,列的名称之间需要用逗号进行分隔。
ASC。可选(默认)。如果既没有声明ASCmeasures,也没有声明DESC,则默认设置为ASC。ASC选项用于通知SQL Server将列按升序保存。
土耳其语
DESC。可选。它通知SQL Server将列以降序保存。
WITH。可选。不过如果必须使用下面的任何选项,则该WITH选项都是必填的。
IGNORE_DUP_KEY。这个选项只在索引中定义了UNIQUE的时候才有效。如果在前面没有使用UNIQUE选项,则无效。我们一会再对此进行解释。fire
DROP_EXISTING。如果在数据库中存在相同名称的索引,则可以使用该选项。它会在重建索引之前先删除原先的索引。如果你实际上并不改变索引中的任何列,那么这个选项很有用。我们一会再进行说明。
SORT_IN_TEMPDB。在一个已经有数据的表中构建索引的时候,建议使用这个选项,如果表是一个很大的表,会在临时数据库tempdb中对数据按索引排序,正如我们在第3章所介绍的。如果你有一张大表,或者tempdb数据库位于另一个磁盘上,则可以使用这个选项。这个选项会加速索引的构建,因为SQL Server会对保存表的磁盘设备进行读取,同时对tempdb表所在的另一磁盘设备进行写入。这种读取和写入是并发进行的,从而提高了性能。
ON。可选。如果要指定将索引创建在特定的文件组中的时候,这个选项则是必填的。如果希望将索引构建在PRIMARY文件组,则这个选项不必填。
filegroup。这是要保存索引的文件组的名称。在当前,我们只有一个文件组,即PRIMARY。PRIMARY是一个保留字,如果要使用它,需要用方括号([])将之括住。
有两个选项需要更进一步讨论:IGNORE_DUP_KEY和DROP_EXISTING。这将在下面的两节中予以介绍。
1. IGNORE_DUP_KEY
如果将索引定义为foreign exchange rateUNIQUE,那么不管怎样尝试,你都无法添加一个在该列中包含重复值的新行。然而,根据在索引上所进行的这一设置,可以执行两种操作。
在进行多行插入的时候,如果指定了IGNORE_DUP_KEY选项,那么即使在插入的行中存在与唯一索引相冲突的内容,老友记第八季下载SQL Server也不会生成错误信息,而只是生成一个警告信息。那条与现有唯一索引相冲突的行不会被插入,而其他的行则能够成功插入。
在执行多行插入的时候,如果省略了IGNORE_DUP_KEY选项,那么只要有某些行违背了唯一索引,在SQLServer中都将产生错误信息,整个批操作都会被回滚,所有的行都不会被插入到表中。
注意 每次SQL Server进行了一项操作之后,可以通过名为@@ERROR的系统变量来测试是否出现了错误,或者也可以通过Try/Catch这样的错误处理机制来判断是否存在错误。如果出现了错误,通常需要在批操作中进行某些类型的错误处理。如果使用了IGNORE_DUP_KEY选项,则在试图插入重复的行时,不会生成错误,这样在记录被插入的时候,批操作就能正常运行。当然,要小心,在这种情况下,表面上每件事都工作得很好,但实际上可能有某些行没有被插入。
2. DROP_EXISTING
在数据被插入和修改时,索引会被膨胀多次,比理想状态要大很多。就像Access数据库需要被压缩一样,有时闽南话翻译SQL Serverdiskman中的索引也需要被压缩。通过消除索引中的碎片对索引进行压缩可以加快性能,也可以减少对磁盘空间的占用。要压缩索引,可以重建索引,而无需实际修改列中的数据,或者,实际上,可以从无到有,构建整个索引,并访问表中的每
一行。
在重建聚集索引时,相比在free riceDROP INDEX命令后再使用CREATE INDEX命令来说,DROP_EXISTING子句提供更强的性能。如果列包含在聚集索引中,每当表的聚集索引被重建时,非聚集索引也会被重建。聚集索引的必须用原来的名字,同样,排序顺序以及创建索引的分区也必须保持一致。最后,唯一性属性也不能改变。因此,如果删除聚集索引再重建它,现有的非聚集索引会被重建两次(如果要重建的话):一次是在删除索引之后,一次是在创建索引之后。当你在时间很关键的批处理窗口中工作时,这一点十分重要,必须谨记。考虑到表和要创建的索引的大小,或许重建聚集索引的工作只能放在周末进行。
DROP_EXISTING可以允许通过显式地删除再重建索引,对现存的索引进行重建。这在重建主键索引的时候特别有用。在采用传统的方法重建主键索引的时候,因为其他的表可能引用了主键,所以需要先在这些表中删除指向该主键上的外键。而通过指定DROP_EXISTING子句,SQL Server会重建索引,而不会对主键约束性产生影响。