使用SQL语句管理索引
1. 创建索引
本次实验环境基于DMS数据库实验室的RDS-SQL Server,前往并登录DMS数据库实验室。
如果要在一本书中快速地查找所需的信息,可以利用目录快速地进行查找,而不是一页页地查找。数据库中的索引与书籍中的目录类似,可以让数据库应用程序利用索引快速地查找到所需内容,而不需要扫描整个数据库。在图书中,目录是内容和页码的列表清单。在数据库中,索引就是表中数据和相应存储位置的列表。索引是以表的列为基础的数据库对象,是为了加速对表中数据行的检索而创建的一种单独的存储结构。当 SQL Server 执行查询时,查询优化器评估可用于检索数据的每种方法,然后选择最有效的方法。可能采用的方法包括扫描表和扫描一个或多个索引(如果有)。扫描表时,查询优化器读取表中的所有行,并提取满足查询条件的行。扫描表时会有许多磁盘 I/O 操作,并占用大量资源。查询优化器使用索引时,搜索索引键列,查找到所需查询行的存储位置,然后从该位置提取匹配行。通常,搜索索引比搜索表要快得多,这是因为索引与表不同,一般每行包含的列非常少,且行遵循排序顺序。
使用SQL语句创建索引、修改索引和删除索引的具体操作步骤如下:
创建索引。
使用SQL语句创建所以的基本语法格式:
CREATE [UNIQUE][CLUSTERED|NONCLUSTERED] INDEX index_name ON {table_or_view_name}(column[ASC|DESC][,…n])}
参数说明:
UNIQUE:用于指定为表或视图创建唯一索引,即不允许存在索引值相同的两行。省略该参数则表示创建的索引为非唯一索引。 CLUSTERED:用于指定创建的索引为聚集索引。 NOCLUSTERED:用于指定创建的索引为非聚集索引,为默认值。 index_name:索引名称。索引名称在表或视图中必须唯一,但在数据库中不必唯一。索引名称必须符合标识符的命名规则。 table_or_view_name:要建立索引的表或视图的名称。 column:索引中包含的列的名称。指定两个或多个索引,可以为指定的列组合值创建复合索引。 ASC | DESC:用于指定某个索引列以升序或降序方式排序。默认设置为ASC。
示例:
在SQL Console页签,输入如下在students表的id列上创建唯一索引index_id的SQL语句,单击执行,然后在执行确认对话框中,单击直接执行。
说明:本例在students表上创建非聚集唯一索引,该索引将自动检查表中id列是否有重复的值。
CREATE UNIQUE INDEX index_id ON students(id)
在表区域,单击 图标刷新,选择[dms].students>索引,您可以查看到新增的唯一索引index_id。
修改索引。
使用 ALTER INDEX 语句可以修改索引的定义,其基本语法格式:
ALTER INDEX{index_name|ALL} ON { REBUILD [[WITH([,…n])] |[ PARTITION = partition_number [WITH( [,…n])]]] | DISABLE | REORGANIZE [PARTITION = partition_number]
[WITH(LOB_COMPACTION= {ON|OFF})] | SET([,…n]) }[;]
参数说明:
index_name:索引的名称。 ALL:指定与表或视图相关联的所有索引。 object:索引所基于的表或视图的名称。 REBUILD:指定将使用相同的列、索引类型、唯一性属性和排序顺序重新生成索引。 rebuild_index_option:对填充因子等索引选项的重新设置。 PARTITION=partition_number:指定只重新生成或重新组织索引的一个分区。 single_partition_rebulid_index_option:单个分区重建索引参数。 DISABLE:将索引标记为禁用,从而不能由数据库引擎使用。 REORGANIZE:指定将重新组织的索引页级。 LOB_COMPACTION={ON | OFF}:指定压缩所有包括大型对象(LOB)数据的页。 set_index_option:指定不重新生成或重新组织索引的索引选项。
删除索引。
使用 DROP INDEX 语句可以删除当前数据库中一个或多个索引,其语法格式:
DROP INDEX {table_name | view_name}.index_name[…,n]
示例:
在SQL Console页签,输入如下删除students表上的index_id索引的SQL语句,单击执行,然后在执行确认对话框中,单击直接执行。
DROP INDEX students.index_id
在表区域,单击 图标刷新,选择[dms].students>索引,您可以查看到students表上的index_id索引已被删除。
2. 实验作业
表1 student_info表的数据
学号 |
姓名 |
性别 |
出生日期 |
家族住址 |
0001 |
张青平 |
男 |
2000-10-01 |
衡阳市东风路77号 |
0002 |
刘东阳 |
男 |
1998-12-09 |
东阳市八一北路33号 |
0003 |
马晓夏 |
女 |
1995-05-12 |
长岭市五一路763号 |
0004 |
钱忠理 |
男 |
1994-09-23 |
滨海市洞庭大道279号 |
0005 |
孙海洋 |
男 |
1995-04-03 |
长岛市解放路27号 |
0006 |
郭小斌 |
男 |
1997-11-10 |
南山市红旗路113号 |
0007 |
肖月玲 |
女 |
1996-12-07 |
东方市南京路11号 |
0008 |
张玲珑 |
女 |
1997-12-24 |
滨江市新建路97号 |
表2 curriculum表的数据
课程编号 |
课程名称 |
学分 |
0001 |
计算机应用基础 |
2 |
0002 |
C语言程序设计 |
2 |
0003 |
数据库原理及应用 |
2 |
0004 |
英语 |
4 |
0005 |
高等数学 |
4 |
表3 grade表的数据
学号 |
课程编号 |
分数 |
0001 |
0001 |
80 |
0001 |
0002 |
91 |
0001 |
0003 |
88 |
0001 |
0004 |
85 |
0001 |
0005 |
77 |
0002 |
0001 |
73 |
0002 |
0002 |
68 |
0002 |
0003 |
80 |
0002 |
0004 |
79 |
0002 |
0005 |
73 |
0003 |
0001 |
84 |
0003 |
0002 |
92 |
0003 |
0003 |
81 |
0003 |
0004 |
82 |
0003 |
0005 |
75 |
使用SQL语句ALTER TABLE分别删除studentsdb数据库的student_info表、grade表、curriculum表的主键索引。
使用SQL语句为curriculum表的课程编号创建唯一性索引,命名为cno_idx。
使用SQL语句为grade表的“分数”字段创建一个普通索引,命名为grade_idx。
使用SQL语句为grade表的“学号”和“课程编号”字段创建一个复合唯一索引,命名为grade_sid_cid_idx。
查看grade表上的索引信息。
使用SQL语句删除索引grade_idx。再次查看grade表上的索引信息。
实验链接:https://developer.aliyun.com/adc/scenario/01f4686f1f6048098d9323671db9b41c