看到的一篇写的很详细哦,受益匪浅,直接甩链接吧
http://www.cnblogs.com/hyd1213126/p/5828937.html
下面是自己写的一部分:
1、索引的概念:
C1.聚集索引
聚集索引将数据行的键值在表内排序并存储对应的数据记录,使得数据表物理顺序与索引顺序一致。
这意味着不论聚集索引里有表的哪个(或哪些)字段,这些字段都会按顺序地被保存在表中。由于存在这种排序,所以每个表只会有一个聚集索引。
C2.非聚集索引
非聚集索引完全独立于数据行的结构。
一个表中最多只能有一个聚集索引,但可有一个或多个非聚集索引。当在SQLServer上创建索引时,可指定是按升序还是降序存储键。
2、建立索引
使用CREATE INDEX语句可以为表创建索引。
语法格式:
CREATE[ UNIQUE ] /*指定索引是否唯一*/
[ CLUSTERED | NONCLUSTERED ] /*索引的组织方式*/
INDEX <索引名>
ON<表名>( <列名> [ ASC | DESC ] [ ,…n ] ) /*索引定义的依据*/
[ WHERE <列名> IN (<筛选值>,…)
| <列名><筛选谓词> <筛选值>] /*筛选索引*/
[WITH ( <索引选项> [ ,…n ] ) ] /*索引选项*/
[ ; ]
说明:
(1)UNIQUE:表示为表或视图创建唯一索引(即不允许存在索引值相同的两行)。例如,对于XSB表,根据学号创建唯一索引,即不允许有两个相同的学号出现。此关键字的使用有两点需注意:
对于视图创建的聚集索引必须是UNIQUE索引;
如果对已存在数据的表创建唯一索引,必须保证索引项对应的值无重复值。
(2)CLUSTERED| NONCLUSTERED:用于指定创建聚集索引还是非聚集索引,前者表示创建聚集索引,后者表示创建非聚集索引。一个表或视图只允许有一个聚集索引,并且必须先为表或视图创建唯一聚集索引,然后才能创建非聚集索引。默认为NONCLUSTERED。
(3)索引名在表或视图中必须唯一,但在数据库中不必唯一。
(4)用于指定建立索引的列名可以有一个或多个。指定索引字段时,要注意:
l表或视图索引字段的类型不能为ntext、text或image;
l通过指定多个索引字段可创建复合索引,但复合索引的所有字段必须取自同一表。
例子如下:
(1)为KCB表的KCM列创建索引。
USEPXSCJ
GO
CREATEINDEX kc_name_ind
ON KCB(KCM)
(2)根据KCB表的KCH列创建唯一聚集索引,因为指定了CLUSTERED,所以该索引将对磁盘上的数据进行物理排序。
CREATEUNIQUE CLUSTERED INDEX kc_id_ind
ON KCB(KCH)
3、修改索引
索引使用一段时间后,可能需要重新创建,这时可以使用ALTER INDEX语句来重新生成原来的索引。语法格式:
ALTERINDEX { <索引名> | ALL }
ON [ <表名>
{ REBUILD
[ WITH( <索引选项> [ ,…n ] ) ]
| DISABLE
| REORGANIZE
[ WITH ( LOB_COMPACTION = { ON | OFF } ) ]
}
[ ; ]
【强化练习】
(1)重建KCB表上的所有索引:
USEPXSCJ
GO
ALTERINDEX ALL ON KCB REBUILD
(2)重建KCB表上的kc_name_id索引:
ALTERINDEX kc_name_ind ON KCB REBUILD
4、删除索引
使用DROP INDEX语句可以从当前数据库中删除一个或多个索引。语法格式如下:
DROPINDEX
{ <索引名> ON <表名>[ ,…n ]
| <表名>.<索引名>[ ,…n ]
}
【强化练习】
删除PXSCJ数据库中表KCB的一个索引名为kc_name_ind的索引。
IFEXISTS (SELECT name FROM sysindexes WHERE name = 'kc_name_ind')
DROP INDEX KCB.kc_name_ind