索引(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对其进行碎片整理。