SQL 索引的作用(真的是超详细)

看到的一篇写的很详细哦,受益匪浅,直接甩链接吧

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

Published by

风君子

独自遨游何稽首 揭天掀地慰生平