3. B树索引对于删除(DELETE)的管理
与索引相关的一个比较重要的视图 index stats
该视图显示了大量索引内部的信息,该视图正常情况下没有数据,只有在运行了下面的命令以后才会被填充数据,而且该视图中只能存放一条与分析过的索引相关的记录,不会有第二条记录同时,也只有运行了该命令的 session才能够看到该视图里的数据,其他 session 不能看到其中的数据。
analyze index INDEX_NAME validate structure;
不过要注意一点,就是该命令有一个坏处,就是在运行过程中,会锁定整个表,从而阻塞其他 session 对表进行插入、更新和删除等操作。这是因为该命令的主要目的并不是用来填充 index_stats 视图的,其主要作用在于校验索引中的每个有效的索引条目都对应到表里的一行,同时表里的每一行数据在索引中都存在一个对应的索引条目。为了完成该目的,所以在运行过程中要锁定整个表,同时对于很大的表来说,运行该命令需要耗费非常多的时间。
当删除表里的一条记录时,其对应于索引里的索引条目并不会被物理的删除,只是做了一个删除标记。
当一个新的索引条目进入一个索引叶子节点的时候,oracle 会检查该叶子节点里是否存在被标记为删除的索引条目,如果存在,则会将所有具有删除标记的索引条目从该叶子节点里物理的删除。oracle 会将当前所有被清空的叶子节点(该叶子节点中所有的索引条目都被设置为删除标记)收回,从而再次成为可用索引块
尽管被删除的索引条目所占用的空间大部分情况下都能够被重用,但仍然存在一些情况可能导致索引空间
被浪费,并造成索引数据块很多但是索引条目很少的后果,这时该索引可以认为出现碎片。
而导致索引出现碎片的情况主要包括:
不合理的、较高的 PCTFREE。
4.关于答案解析
1)索引应该在 SQL 语句的"where"或"and"部分涉及的表列(也称谓词)被建立。
2)用户应该索引具有一定范围的表列,数据重复且分布平均的表字段不适合建立索引,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
3)如果在SQL语句谓词中多个表列被一起连续引用,则应该考虑将这些表列一起放在一个索引内, Oracle将维护单个表列的索引(建立在单一表列上)或复合索引(建立在多个表列上)。复合索引的建立顺序按照使用的频度来确定。
4)如果多数查询返回结果都超过表中总行数的4%,那么一般不宜建立索引。比如上图中的id列,如果根据id>10的条件查出的结果占总行数的大多数,那么走索引效率”、“