索引(INDEX):是对数据库表中一个列或多个列的值(称为索引值)进行排序的结构。

一个表可以创建多个索引。检索数据时,通过相应索引的索引值所指向的表中的数据行,能快速查找到所需要的数据。

如果索引不当,会加大更新数据的成本。

索引的不同分类: 聚集索引和非聚集索引

        主键索引和非主键索引

         惟一索引和非惟一索引

         单列索引和复合索引

(二)、索引名词及含义

一、聚集( CLUSTERED)索引:数据行的物理存储顺序与索引顺序完全相同。每个表只能有一个聚集索引。

非聚集( NONCLUSTERED )索引:不改变表中数据行的物理存储数序。它建立一个逻辑表,记录索引值在表中的实际存储位置。

一个表上最多可以建立249个非聚集索引。

创建索引时如果没给出CLUSTERED 或NONCLUSTERED,则默认创建非聚集索引。

 

二、主键索引: 默认情况下,创建主键约束时自动创建基于主键的聚集索引。在创建聚集索引时,可以指定填充因子(默认值为0),

以便在索引页上保留一定百分比的空间,减少发生索引页拆分的情况。

非主键索引:在非主键的属性列上创建的索引,一般都是非聚集索引。

 

三、惟一( UNIQUE )索引:

索引列值不会出现重复值。在创建主键约束或惟一约束时,会自动为这些约束创建惟一索引;

也可以在创建索引时使用UNIQUE选项。

非惟一索引: 索引列值不惟一。

 

 

四、单列索引:基于表中单列创建的索引。

复合索引:基于表中多个列所创建的索引。应先定义最可能具有惟一性的属性列。

(三)、1.何时使用索引

       如果已经创建了两个索引:一个是基于StuNo列的索引(聚集),另一个是基于StuName列的索引, 何时使用这些索引?

查询时SQL Server会自动选择与查询相匹配的索引。 执行如下查询语句时,可能会使用基于StuNo列的索引:

SELECT * FROM Student WHERE StuNo='00000001'

2.如何提高系统性能

      为了提高系统的性能,可将索引创建在与数据文件、日志文件不同的存储设备上。

3.创建索引,方法:

      使用Management Studio创建索引 使用CREATE INDEX语句 CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED] INDEX index_name ON table_name(column_name,…..)

4.复合索引:

      在(列1,列2)上创建的复合索引与在(列2,列1)上创建的复合索引是不同的。

查询数据时,只有在WHERE子句中使用了复合索引的第1个列时才会使用所创建的复合索引。

复合索引中列的顺序很重要:在次序上首先定义最具惟一性的列。

5.重命名索引

     EXEC SP_RENAME ‘table_name.old_index_name’,’new_index_name’

6.删除索引

      使用SQL语句: DROP INDEX table_name.index_name

7.显示索引信息:

      SP_HELPINDEX table_name

8.显示查询计划:

      索引分析:可以查看查询时系统是否使用了所创建的索引。

      set showplan_all on

      SELECT语句

      set showplan_all off

9.显示磁盘读取信息:
      设置显示磁盘IO统计选项为: SET STATISTICS ON|OFF

10.注意事项

      ⑴.创建非聚集索引之前需要先创建聚集索引。

      ⑵.不能用DROP INDEX语句删除由PRIMARY KEY约束或UNIQUE约束创建的索引。

      ⑶.要删除这些索引必须先删除PRIMARY KEY约束或UNIQUE约束。

      ⑷.在删除聚集索引时,表中的所有非聚集索引都将被重建。

11.维护索引

更新统计信息:

【问题8.10】在SQL Server Management Studio中通过设置Xk数据库的属性决定是否实现统计的自动更新。

【问题8.11】使用UPDATE STATISTICS命令。更新Xk数据库中的Student表的PK_Student索引的统计信息。 扫描表:

【问题8.12】利用DBCC SHOWCONTIG获取Xk数据库中Student表的PK_Student索引碎片信息。

12.索引整理

      当表或视图上的聚集索引和非聚集索引页级上存在碎片时,

可以通过DBCC INDEXDEFRAG对其进行碎片整理。