第七章 索引及其应用
索引是一种特殊类型的数据库对象,它保存着数据表中一列或几
列组合的排序结构。为数据表增加索引,可以大大提高数据的检索效
率。索引是数据库中一个重要的对象,本章将详细介绍索引的基本概
念、使用索引的意义、创建索引的方法以及对索引的操作。
? 索引的基础知识
? 索引的分类
? 索引的操作
? 索引的分析与维护
第七章 索引及其应用
? 索引的基础知识
1,数据存储
SQLServer 2000 中,数据存储的基本单位是页,其大小是 8KB,
SQL Server 2000 数据库的数据文件中包含八种页类型,数据、索引、
文本 /图像、全局分配映射表与辅助全局分配映射表、页的可用空间、
索引分配映射表、大容量更改映射表、差异更改映射表。
2,索引
1)索引的概念
索引是以表列为基础建立的数据库对象,它保存着表中排序的索
引列,并且记录了索引列在数据表中的物理存储位置,实现了表中数
据的逻辑排序。
2)使用索引的意义
索引在数据库中的作用与目录在书籍中的作用类似,都用来提高
查找信息的速度。
第七章 索引及其应用
? 索引的基础知识
3)使用索引的代价
为每一列都建立索引是不明智的,因为使用索引要付出一定的代价:
索引需要占用数据表以外的物理存储空间。
创建索引和维护索引要花费一定的时间。
当对表进行更新操作时,索引需要被重建,这样降低了数据的维
护速度。
4)建立索引的原则
认真考虑哪些列应该建索引,哪些列不该建索引。一般原则是:
主键列上一定要建立索引。
外键列可以建索引。
在经常查询的字段上最好建立索引。
对于那些查询中很少涉及的列、重复值比较多的列不要建索引
对于定义为 text,Image和 Bit数据类型的列上不要建立索引。
第七章 索引及其应用
?索引的分类
根据索引的存储结构不同将其分为两类:
聚集索引
聚集索引是指表中数据行的物理存储顺序与索引顺序完全相同。
聚集索引由上下两层组成,上层为索引页,包含表中的索引页面,用
于数据检索,下层为数据页。
非聚集索引
非聚集索引不改变表中数据行的物理存储位置,数据与索引分开
存储,通过索引带有的指针与表中的数据发生联系。
第七章 索引及其应用
?索引的分类
索引页
数据页
根结点
第七章 索引及其应用
?索引的分类
系部代码 指针地 址
01 8
02 2
03 5
04 4
05 1
06 7
07 6
08 3
系部代码 系部名称 系主任
05 社会科学部 刘克忠
02 经济管理系 刘国峰
08 建筑系 王未起
04 基础科学部 王彬
03 传播技术系 田建国
07 农林系 陈瑞修
06 机电工程系 王伟东
01 计算机系 刘海军
第七章 索引及其应用
?索引的操作 (创建, 查询索引, 更名, 删除索引, 设置选项 )
创建索引 ---利用企业管理器直接创建索引 。 其具体步骤如下:
1)在企业管理器中,选择要创建索引的表(如:教师表),右击该
表。在弹出的菜单中选择“所有任务”下的“管理索引”命令,打开
“管理索引”对话框。在该对话框中显示了当前表中已有的索引,包
含其名称、是不是聚集索引和索引字段的名称。
2)单击“新建”按钮,打开“新建索引”对话框。设定索引的各属
性。
3)完成后,单击“确定”按钮,即可生成新的索引。
第七章 索引及其应用
?索引的操作 (创建, 查询索引, 更名, 删除索引, 设置选项 )
创建索引 ---利用企业管理器中的索引向导创建索引 。
1)在企业管理器中,从“工具”菜单中选择“向导”命令,打开“
选择向导”对话框。
2)单击“选择向导”对话框中“数据库”左边的加号图标,然后选
择“创建索引向导” 。
3)单击“确定”按钮,打开“欢迎使用创建索引向导”对话框。
4)在向导的欢迎对话框中,单击“下一步”按钮,打开“选择数据
库和表”对话框。
5)在该对话框中,从数据库名称下拉列表框中选择,STUDENT”
数据库,从对象名中选择“教师任课”表。
第七章 索引及其应用
?索引的操作 (创建, 查询索引, 更名, 删除索引, 设置选项 )
创建索引 ---利用企业管理器中的索引向导创建索引 。
6)选择好数据库和数据表之后,单击“下一步”按钮,打开“当
前索引信息”窗口。在该窗口中,显示了目前已存在的索引。
7)单击“下一步”按钮,打开“选择列”对话框。我们从中选择
需要建索引的列,如课程编号、课程号。
8)单击“下一步”按钮,打开“指定索引选项”对话框,在这里
设置索引的属性,可以设置聚集索引或唯一索引,还可设置填充因
子。
9)指定索引选项后,单击“下一步”按钮,出现“创建完成”对
话框。在其“名称”文本框中为新建索引指定一个名称,然后单击
“完成”按钮。出现消息提示“创建索引成功”时,单击“确定”
按钮,完成索引创建。
第七章 索引及其应用
?索引的操作 (创建, 查询索引, 更名, 删除索引, 设置选项 )
创建索引 ---利用查询分析器创建索引 。
其语法格式如下:
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX
索引名
ON { 表名 | 视图名 } ( 列名 [ ASC | DESC ] [,...n ] )
[ WITH [PAD_INDEX ]
[[,]FILLFACTOR =填充因子 ]
[[,]IGNORE_DUP_KEY]
[[,]DROP_EXISTING]
[[,]STATISTICS_NORECOMPUTE]
[[,]SORT_IN_TEMPDB]
]
[ON filegroup]
第七章 索引及其应用
?索引的操作 (创建, 查询索引, 更名, 删除索引, 设置选项 )
语法注释:
[UNIQUE ] [ CLUSTERED | NONCLUSTERED],指定创建索引的类型,其依次为
唯一索引、聚集索引和非聚集索引。
ASC | DESC,用来指定索引列的排序方式,ASC是升序,DESC是降序。
PAD_INDEX,用来指定索引中间级中每个页(节点)上保持开放的空间。
FILLFACTOR ( 填充因子):指定在 SQL Server创建索引的过程中,各索引页叶
级的填满程度。
IGNORE_DUP_KEY,该选项控制当尝试向属于唯一聚集索引的列插入重复的键值
时所发生的情况。
DROP_EXISTING,用来指定应除去并重建已命名的先前存在的聚集索引或非聚集
索引。
STATISTICS_NORECOMPUTE,用来指定过期的索引统计不会自动重新计算 。
SORT_IN_TEMPDB,指定用于生成索引的中间排序结果将存储在 tempdb 数据库
中。
ON filegroup,用来在给定的 filegroup 上创建指定的索引。
第七章 索引及其应用
?索引的操作 (创建, 查询索引, 更名, 删除索引, 设置选项 )
例:
USE STUDENT
GO
CREATE INDEX bj_xb_index
ON 班级 (系部代码 )
GO
第七章 索引及其应用
?索引的操作 (创建, 查询索引, 更名, 删除索引, 设置选项 )
查询索引信息 — 使用企业管理器查询索引信息
1)在企业管理器中,选择需要的表,右击该表。在弹出的菜单中选择
“所有任务”下的“管理索引”命令,打开“管理索引”对话框。
2)在该对话框的“现有索引”列表中列出了当前表中有多少索引以及
每个索引的名称、类型和关键值。
3)如果需要了解某个索引更加详细的信息,选择该索引,单击“编辑
”按钮,在弹出的“编辑现有索引”对话框中,可以看到当前索引的
详细信息。
查询索引信息 — 使用 SQL命令查询索引信息
其语法格式如下,[EXEC ] sp_helpindex 表名
EXEC sp_helpindex ‘教师’
GO
第七章 索引及其应用
?索引的操作 (创建, 查询索引, 更名, 删除索引, 设置选项 )
索引更名
其语法格式如下:
sp_rename [ @objname = ] 'object_name',
[ @newname = ] 'new_name'
[,[ @objtype = ] 'object_type' ]
例:将 STUDENT数据库中“课程”表的 pk_kc索引名称更改为
pk_kecheng。 其程序清单如下:
USE STUDENT
GO
EXEC sp_rename 'pk_kc‘,'pk_kecheng'
GO
第七章 索引及其应用
?索引的操作 (创建, 查询索引, 更名, 删除索引, 设置选项 )
删除索引 ---使用企业管理器删除索引
1)在企业管理器中,选择要删除索引的表,右击该表。在弹出的菜单
中选择“所有任务”下的“管理索引”命令,打开“管理索引”对话框

2)在该对话框的“现有索引”列表中选择需要删除的索引,单击“删
除”按钮后,出现一个消息框,让用户确认是否删除索引,单击“是”
按钮,删除索引。
删除索引 ---使用 DROP INDEX 语句删除索引
其语法格式如下,DROP INDEX 表名,索引名 [,… n]
例:删除 STUDENT数据库中“班级”表的 bj_xb_index索引,程序如下

USE STUDENT
GO
DROP INDEX 班级,bj_xb_index
GO
第七章 索引及其应用
?设置索引的选项 ---设置 FILLFACTOR选项
为了尽量减少页拆分,在创建索引时,可以选择 FILLFACTOR(
称为填充因子)选项,此选项用来指定各索引页叶级的填满程度,这样
在索引页上就可以留出额外的间隙和保留一定百分比的空间,供将来表
的数据存储容量进行扩充和减少页拆分。
例:为 STUDENT数据库中“班级”表创建基于“系部代码”列的非聚
集索引 bj_xb_index,其填充因子值为 60,其程序清单如下:
USE STUDENT
GO
CREATE INDEX bj_xb_index ON 班级 (系部代码 )
WITH FILLFACTOR=60
GO
第七章 索引及其应用
?设置索引的选项 ---设置 PAD_INDEX选项
对于非叶级索引页需要使用 PAD_INDEX选项设置其预留空间的大
小。 PAD_INDEX 选项只有在指定了 FILLFACTOR 时才有用,因为
PAD_INDEX 使用由 FILLFACTOR 所指定的百分比。
例:为 STUDENT数据库中“班级”表创建基于“系部代码”列的非聚
集索引 bj_xb_index,其 FILLFACTOR和 PAD_INDEX选项值均为 60,其
程序清单如下:
USE STUDENT
GO
CREATE INDEX bj_xb_index ON 班级 (系部代码 )
WITH PAD_INDEX,FILLFACTOR=60
GO
第七章 索引及其应用
?索引的分析
1,SHOWPLAN
SHOWPLAN语句用来显示查询语句的执行信息,包含查询过程
中连接表时所采取的每个步骤以及选择哪个索引。其语法格式为:
SET SHOWPLAN_ALL { ON | OFF }
SET SHOWPLAN_TEXT { ON | OFF }
其中:
ON为显示查询执行信息
OFF为不显示查询执行信息(系统默认)
第七章 索引及其应用
?索引的分析
例:在 STUDENT库中的“学生”表上查询所有男生的姓名和年龄,并
显示查询处理过程。其程序清单如下:
SET SHOWPLAN_ALL ON
GO
SELECT 姓名,YEAR(GETDATE())-YEAR(出生日期 ) AS 年龄
FROM 学生
WHERE 性别 ='男 '
GO
第七章 索引及其应用
?索引的分析
2,STATISTICS IO
STATISTICS IO语句用来显示执行数据检索语句所花费的磁盘活
动量信息,可以利用这些信息来确定是否重新设计索引。其语法格式
为:
SET STATISTICS IO {ON|OFF}
其中:
ON为显示信息
OFF为不显示信息(系统默认)
第七章 索引及其应用
?索引的维护
1、使用 DBCC SHOWCONTIG语句
该语句用来显示指定表的数据和索引的碎片信息。当对表进行大量的
修改或添加数据之后,应该执行此语句来查看有无碎片。其语法格式
如下:
DBCC SHOWCONTIG [{ table_name | table_id | view_name |
view_id },index_name | index_id ] ) ]
其中:
table_name | table_id | view_name | view_id:是要对其碎片信息进行
检查的表或视图。如果未指定任何名称,则对当前数据库中的所有表
和索引视图进行检查。
当执行此语句时,我们重点看其扫描密度,其理想值为 100%,如果
小于这个值,表示表上已有碎片。如果表中有索引碎片,可以使用
DBCC INDEXDEFRAG
命令对碎片进行整理。
第七章 索引及其应用
?索引的维护
2、使用 DBCC INDEXDBRE语句
该语句的作用是整理表中索引碎片,其语法格式为:
DBCC INDEXDEFRAG
( { database_name | database_id | 0 }
,{ table_name | table_id | 'view_name' | view_id }
,{ index_name | index_id }
)
其中:
database_name | database_id | 0:指对其索引进行碎片整理的数据库
。数据库名称必须符合标识符的规则。如果指定 0,则使用当前数据
库。
table_name | table_id | 'view_name' | view_id:指对其索引进行碎片整
理的表或视图。
index_name | index_id:需要进行碎片整理的索引名称。