ORACLE11g试题答案(陈冬亮) 下载本文

6.下面关于约束与索引的说法不正确的是( D )

A.在字段上定义PRIMARY KEY约束时会自动创建B树唯一索引 B.在字段上定义UNIQUE约束时会自动创建一个B树唯一索引

C.默认情况下,禁用约束会删除对应的索引,而激活约束会自动重建相应的索引 D.定义FOREIGN KEY约束时会创建一个B树唯一索引。

7.假设在一个表的3个字段NAME、SEX和BIRTH中分别保存姓名、性别和出生年月数据,则应当为这三个字段分别创建( C )索引。 A.全部创建B树索引 B.全部创建位图索引

C.分别创建B树索引、位图索引和位图索引

D.分别创建B树索引、位图索引和给予函数的索引

8.使用ALTER INDEX?REBUILDER语句不可以执行下面的哪个任务?( C ) A.将反向键索引重建为普通索引 B.将一个索引移动到另一个表空间 C.将位图索引更改为普通索引

D.将一个索引分区移动到另一个表空间 9.关于索引描述不正确的是( B )

A.表是否具有索引不会影响到所使用的SQL的编写方式 B.在为表创建索引后,所有的查询操作都会使用索引 C.为表创建索引后,可以提高查询的执行速度

D.在为表创建索引后,Oracle优化器将根据具体情况决定是否采用索引。 10.列上创组合索引(也称为___B___)是在表的多个建的索引。 A. 压缩索引 B. 连接索引 C. 一致索引 D. 位图索引

二、填空题

1. 索引 对于查询的结果没有任何影响,但能加快对表执行SQL语句的速度,相应地也就提高了获取查询结果的速度。

2.在Oracle的索引类型中,最古老,同时也是最常用的就是 标准B树索引 ,在效率上通常会胜过简单查询。

3.如果表中某列的基数比较低,则应该在该列上创建 位图 索引。

4.如果要获得索引的使用情况,可以通过查询 V$OBJECT_USAGE 视图;而要获知索引的当前状态,可以查询 INDEX_STATS 视图。

5.在B树索引中通过在索引中保存排过序的 索引列值 与相对应记录的 ROWID 来实现快速查找。

6.在Oracle 11g中,可以使用 CREATE INDEX 语句创建索引。 三、问答题

1. 谈谈你对索引的认识? 解:

在关系型数据库中,索引是一种非常重要的模式对象,是一种与表有关的数据库结构,

29

它可以用来快速地寻找那些具有特定值的记录,使对应于表的SQL语句执行得更快。索引的作用相当于图书的目录,例如想要在一本书中找到有关方面的知识时,可以采用两种方法:一种方法是从书的开头向后逐页翻阅,这样需要翻阅全书才能找到所需要的知识内容;另一种方法是从书的目录中查找所需要的知识主题,然后根据目录中的页码找到所需要的知识内容。非常明显,采用第二种方法要比第一种方法查找要快。同样,如果一个表汇总包含很多记录,当没有建立索引,对表进行查询时,第一种方法执行查询时必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。第二种方法通过在表中建立类似于目录的索引,然后在索引中找到符合查询条件的索引值,最后就可以通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录,而无需扫描任何记录即可迅速得到目标记录所在的位置,这就是索引的作用。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。

在Oracle中可以创建多种数据类型的索引,以适应各种表的特点,常用的索引类型有B树索引、反向键索引、位图索引、基于函数的索引、簇索引、全局和局部索引等。

2.使用索引查询一定能提高查询的性能吗?为什么? 解:

通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价。

索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:

(1)基于一个范围的检索,一般查询返回结果集小于表中记录数的30%宜采用; (2)基于非唯一性索引的检索。

索引就是为了提高查询性能而存在的,如果在查询中索引没有提高性能,只能说是用错了索引,或者讲是场合不同

3.ORACLE都有什么索引?分别适用于什么情况? 解:

常用的索引类型有B树索引、反向键索引、位图索引、基于函数的索引、簇索引、全局和局部索引等。

(1)B树索引:适合与大量的增、删、改,不能用包含OR操作符的查询;适合高基数的列(唯一值多),典型的树状结构;每个结点都是数据块;大多都是物理上一层、两层或三层不定,逻辑上三层;叶子块数据是排序的,从左向右递增;在分支块和根块中放的是索引的范围;

(2)反向键索引:建立一个反向索引将把每个列的键值(each column key value)按字节反向过来,对于组合键,列的顺序被保留,但每个列的字节都作了反向。反向键索引有它局限性:如果在WHERE语句中,需要对索引列的值进行范围性的搜索,如BETWEEN、<、>等,其反向键索引无法使用,此时,Oracle将执行全表扫描;只有对反向键索引列进行 <> 和 = 的

30

比较操作时,其反向键索引才会得到使用;

(3)位图索引:适合与决策支持系统;做UPDATE代价非常高;非常适合OR操作符的查询;基数比较少的时候才能建位图索引;

(4)基于函数的索引:基于函数的索引只是常规的B树索引,但它是基于一个应用于表数据的函数,而不是直接放在表中数据本身上的,因此可以把基于函数的索引看成是一个虚拟列上的索引,当然这里的函数可以是系统函数,也可以是用户自定义的函数。

为了在自己的模式中的表上创建基于函数的索引,必须有系统特权QUERY REWRITE;为了在其他模式中的表上创建基于函数的索引,必须有系统特权GLOBAL QUERY REWRITE;

(5)簇索引:用户创建簇必须具有CREATE CLUSTER系统权限,如果想在其他模式中创建簇,还必须具有CREATE ANY CLUSTER系统权限。创建簇之后,用户可以在簇中创建表,也就是簇表(EMP和DEPT表),在将数据行插入簇表之前,还必须创建簇索引;

(6)全局和局部索引:通常在对表进行分区时,也会将对应的索引进行分区,分区索引就是在每个区上单独创建索引,它能自动维护,在drop或truncate某个分区时不影响该索引的其他分区索引的使用。分区的表可以具有未分区的索引,未分区的表可以具有分区的索引,索引与表是相互独立的模式对象,对索引进行分区和对表进行分区目的都是为了更加容易管理与维护。全局索引就是在全表上创建索引,它可以为索引创建自己的分区。局部索引就是在各个分区表上创建的索引。

4.简要介绍数据库中的位图索引和B树索引? 解:

(1)B树索引是Oracle中默认的最常用的索引,缺省条件下建立的索引就是这种类型的索引。B树索引中的B是平衡之意(Balanced),它可以是唯一或非唯一的,可以是单列或多列。B树索引是一对一的,一个索引条目指向一行。B树索引的组织结构类似一个树,由枝干块(branch block)和树叶块(leaf block)组成,枝干块包含了索引列(关键字)和另一索引的地址。树叶块包含了关键字和给表中每个匹配行的ROWID。

(2)位图索引(bitmap index)是从Oracle7.3 版本开始引入的。目前Oracle 企业版和个人版都支持位图索引,但标准版不支持。位图索引是为数据仓库/在线分析查询环境设计的,在此所有查询要求的数据在系统实现时根本不知道。位图索引特别不适用于OLTP 系统,如果系统中的数据会由多个并发会话频繁地更新,这种系统也不适用位图索引。

5.简述反向键索引的工作原理 解:

如果索引列的数据以严格的有序的方式插入,那么B树索引树将变成一棵不对称的\歪树\,如图1所示:

31

图1 不对称的B树索引

我们使用一个传统的B树索引,这些值就可能会放到同一个索引块上,这样就会加剧这一叶子结点块的热块竞争。如果在将数据放在索引中之前,将先把所存储数据的字节反转,这样原本可能在索引中相邻放置的值在字节反转之后就会相距很远,通过反转字节,对索引的插入的数据就会放在多个块上,如1000,10001,10011,10111,1100经过反向后的值将是0001,1001,1101,0011。经过位反向处理的有序数据变得比较随机了,这样所得到的索引树就比较对称,从而提高表的查询性能,如图2所示:

图2 对称的B-Tree索引

比较图1和图2,在图1中搜索到A块需要进行5次I/O操作,而图 2仅需要3次I/O操

作。

建立一个反向索引将把每个列的键值(each column key value)按字节反向过来,对于组合键,列的顺序被保留,但每个列的字节都作了反向。反向键索引有它局限性:如果在WHERE语句中,需要对索引列的值进行范围性的搜索,如BETWEEN、<、>等,其反向键索引无法使用,此时,Oracle将执行全表扫描;只有对反向键索引列进行 <> 和 = 的比较操作时,其反向键索引才会得到使用。

32