数据库原理与应用(清华大学版)课后答案第11章 索引
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
索 引 11.1 练习题11及参考答案
1.什么是索引?索引分为哪两种?各有什么特点?
答:索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。根据索引的顺序与数据表的物理顺序是否相同,可以把索引分成两种类型:
∙ 聚簇索引:数据表的物理顺序和索引表的顺序相同,它根据表中的一列或多列值
的组合排列记录。
∙ 非聚簇索引:数据表的物理顺序和索引表的顺序不相同,索引表仅仅包含指向数
据表的指针,这些指针本身是有序的,用于在表中快速定位数据。
2.创建索引有什么优、缺点?
答:创建索引的优点如下:
(1)加速数据检索。
(2)加快表与表之间的联接。
(3)在使用ORDER BY 和GROUP BY 等子句进行数据检索的时候,可以减少分组和排序的时间。
(4)有利于SQL Server 对查询进行优化。
(5)强制实施行的惟一性。
创建索引的缺点如下:
(1)创建索引要花费时间和占用存储空间。
(2)建立索引加快了数据检索速度,却减慢了数据修改速度。
3.哪些列上适合创建索引?哪些列上不适合创建索引?
答:一般来说,以下的列适合创建索引:
(1)主键:通常检索、存取表是通过主键来进行的,因此,应该考虑在主键上建立索引。
(2)连接中频繁使用的列:用于连接的列若按顺序存放,则系统可以很快地执行连接。如外键,除用于实现参照完整性外,还经常用于进行表的连接。
(3)在某一范围内频繁搜索的列和按排序顺序频繁检索的列。
以下的列不适合创建索引:
第 章
11
(1)很少或从来不在查询中引用的列,因为系统很少或从来不根据这个列的值去查找数据行。
(2)只有两个或很少几个值的列(如性别,只有两个值“男”或“女”),以这样的列创建索引并不能得到建立索引的好处。
(3)以bit、text、image数据类型定义的列。
(4)数据行数很少的小表一般也没有必要创建索引。
4.创建索引时须考虑哪些事项?
答:使用CREA TE INDEX语句创建索引。默认情况下,如果未指定聚集选项,将创建非聚集索引。创建索引时须考虑的事项如下:
∙只有表的所有者可以在同一个表中创建索引。
∙每个表中只能创建一个聚集索引。
∙每个表可以创建的非聚集索引最多为249 个(包括PRIMARY KEY或UNIQUE 约束创建的任何索引)。
∙包含索引的所有长度固定列的最大大小为900字节。例如,不可以在定义为char(300)、char(300) 和char (301) 的三个列上创建单个索引,因为总宽度超过了
900 字节。
∙包含同一索引的列的最大数目为16。
5.如何创建升序和降序索引?
答:创建索引时,可以指定每列的数据是按升序还是降序存储。如果不指定,则默认为升序,另外,CREA TE TABLE、CREA TE INDEX和ALTER TABLE语句的语法在索引中的各列上支持关键字ASC(升序)和DESC(降序),例如:
CREATE TABLE ObjTable --创建表ObjTable
( ObjID int PRIMARY KEY,
ObjName char(10),
ObjWeight decimal(9,3)
)
CREATE NONCLUSTERED INDEX DescIdx ON --创建索引DescIdx
ObjTable(ObjName ASC, ObjWeight DESC)
非聚集索引DescIdx以ObjName列升序、ObjWeight列降序进行索引。
6.FILLFACTOR所代表的物理含义是什么?将一个只读表的FILLFACTOR设为合适的值有什么好处?
答:FILLFACTOR的物理含义是指在定SQL Server创建索引的过程中,各索引页的填满程度。将一个非只读表的FILLFACTOR设为合适的值时,当系统向表中插入或更新数据时,SQL Server不需要花时间拆分该索引页,对于更新频繁的表,系统可以获得更好的更新性能。一个只读表的FILLFACTOR应设为100%。
11.2 上机实验题6及操作过程
在上机实验题5的factory数据库上,使用T-SQL语句完成如下各题:
(1)在worker表中的“部门号”列上创建一个非聚集索引,若该索引已存在,则删除后重建。
(2)在salary表的“职工号”和“日期”列创建聚集索引,并且强制唯一性。
操作过程
(1)对应的程序如下:
USE factory
GO
--判断是否存在depno索引,若存在,则删除之
IF EXISTS(SELECT name FROM sysindexes WHERE name='depno')
DROP INDEX worker.depno
GO
--创建depno索引
CREATE INDEX depno ON worker(部门号)
GO
EXEC sp_helpindex worker
GO
执行结果如下:
index_name index_description index_keys ---------- ------------------------------------------------- -----
depno nonclustered located on PRIMARY 部门号
PK_worker clustered, unique, primary key located on PRIMARY 职工号
(2)对应的程序如下:
USE factory
GO
--判断是否存在no_date索引,若存在,则删除之
IF EXISTS(SELECT name FROM sysindexes WHERE name='no_date')
DROP INDEX salary.no_date
GO
--创建no_date索引
CREATE UNIQUE CLUSTERED INDEX no_date ON salary(职工号,日期)
GO
EXEC sp_helpindex salary
GO
执行结果如下:
index_name index_description index_keys
------------ --------------------------------------- -----------
no_date clustered, unique located on PRIMARY 职工号, 日期