数据库原理与应用(清华大学版)课后答案第11章 索引

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 职工号, 日期

相关文档
最新文档