Oracle数据库索引的类型及其适用场景

索引类型的选择,索引列的选择,表之间的联结类型对于实现最优性能有着很高的重要性。

算法维度上看,索引可以广义分为:B-树索引(oracle索引所使用的结构)位图索引索引组织表

  • B-树索引:实现类似于倒置的树形结构,包括根节点,分支节点,叶子节点,并且使用树遍历算法来搜索列值。叶子节点中包含一对值(索引值,行编号rowid),索引值对应索引键列,行编号则表示行在表中数据块中内存地址;分支节点包含叶子几点目录及存储在其中叶子节点的值范围;根节点包含分支节点目录以及这些分支节点所包含的值范围。

  • 位图索引:适用于不经常进行更新,插入,删除的列。它更适合具有较少唯一值的进行只读运算的数据仓库表(例如:性别列就是个很好的例子,只有男女这样较少的唯一值)。

  • 索引组织表:表本身被组织为一个索引(列值,逻辑行编号),所有的列存储在索引树自身中,使用主键来访问的数据行将只会包含索引访问;所有的列都可以通过索引结构来获取,从而避免了表访问,实现了访问次数的最小化。适合于下面的特点:1、数据行长度较短;2、大多使用主键列进行访问的表


分区上看索引可以分为:范围分区局部索引全局索引)和散列分区

  • 局部分区索引:使用local关键字来建立,其分区边界与表相同。简单来说,每个表分区联结的有一个索引分区。如果sql语句声明了分区键列上的谓语,执行计划就仅需要访问一个或很少索引分区;如果执行计划在最少分区中搜索,性能就会得到提升。

  • 全局分区索引:使用global关键字来创建,起索引分区与表分区边界不一定要匹配,并且表和索引的分区键也可以不一样。对全局分区索引的维护需要获得表较高等级的锁,从而降低了应用的可用性。相反,对于局部索引的维护可以只在分区上完成,只影响相应的表分区。

    注意:范围分区需要定期创建新的分区。

  • 散列索引:对分区索引键列的值使用散列算法进行散列化来确定存储数据行的分区。这种方案适合顺序生成值的列,因为散列值相对是均匀分布的,每个分区数据行总数基本相等。

    注意:
    1、散列分区不需要定期创建新的分区,开始总的分区数就确定了,后面的新增数据会散列分区到各个分区。

    2、散列分区表和索引在应对由唯一索引和主键索引所引起的与并发性相关的性能问题时是非常有效的。因为基本上,索引的当前最右叶子块将会是最主要的资源争夺点,通过散列分区,将最近的数据散列到了各个分区上。
    3、分区键值函数:ora_hash(column_name, 31, 0)将会返回分区ID。

猜你喜欢

转载自blog.csdn.net/WziH_CSDN/article/details/115019510
今日推荐