索引
1 概述
索引是一种树状结构。
索引分为逻辑设计和物理实现。
逻辑设计分为:单列索引、复合索引、唯一性索引和非唯一性索引、基于函数的索引。
物理实现分为:分区索引、非分区索引、B树索引、正向索引、反向索引、位图索引。
惟一索引是索引列值不能重复的索引,非惟一索引是索引列值可以重复的索引。
全表索引:一般查询表时,Oracle顺序扫描所有可能的行,即使找到了匹配行,但并不意味着这个是唯一的匹配,所以还要继续搜索下去。
建立索引语句
Create index 索引名 on 表名(列名);
B树索引:数据都位于基于索引的叶子节点中。叶子节点中包含了构建索引的关键数据和源表中行的rowid。B树索引所有的叶子节点都具有相同的深度,所以无论查询条件是哪种类型或写法,都具有相同的查询速度。无论对于大型表还是小型表,B树索引的效率都是相同的.
Oracle能够尽可能简洁有效地对表进行全表搜索。当优化器决定对表进行全表搜索时,它会批量读取表数据块。
一个索引项只会指向一个单独的表数据块,而且一次只能读取一个数据块。
2 索引开销
索引的出现会对插入、更新、删除操作带来负面影响。
(1)插入影响
如果需要对叶子节点进行分割,并且对它已有的索引项重新分配,进而为新的索引项腾出空间。通常做法是:Oracle会对平均50%的索引项放到分割后的第一部分中,而将另外的50%放到其余的部分中。
当索引的高度增加时,就需要附加的I/O来获取叶子节点。
索引高度不是在索引中出现插入活动的主要开销。开销主要是由于重新组织活动本身,以及获取额外的数据块,这将导致插入操作需要花费很长的时间来完成。
由很多空叶子节点构成的索引与经过了良好压缩的索引相比,需要更多的I/O才可以完全扫描。
在创建索引时,在语句后加上 “pctfree 数字”可以在关闭叶子节点之前只对其进行部分填充。让索引中有空余空间,意味着对索引的扫描会比将pctfree设置为0时花费更长的时间。但这样会节省插入新数据操作时的开销。
(2)更新、删除影响
更新有时会导致叶子节点中的索引项标记为死亡,然后在位置恰当的叶子节点中插入全新的索引项,甚至可能需要进行数据库分割。
将索引项标注为死亡而不是实际删除他们,他们在叶子节点中所占用的空间不会被释放。但可以重新被利用。
3 反转键索�