Oracle索引之索引组织表(IOT)

IOT是Oracle中一种特殊的表结构,以B*tree索引存储,避免重复存储,加快查找速度。文章讨论了IOT的优势、结构,包括主键和其他列存储在叶子块中,以及如何通过INCLUDING子句指定列存储位置。还介绍了包含溢出段的IOT表,对比了IOT表与堆表在逻辑IO数量上的性能差异,并提出了不同索引类型的适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IOT是使用使用方式与其他表一样,但是内部以B*tree索引的格式存储的表。IOT具有如下优势:
       1. 可以避免重复 存储表与索引。
       2. 逐渐查找很快,因为所需的数据就存储在索引的叶子块上。
       3. 有聚簇效应,因为有连续键值的记录都是存储在一起的。这样可以提高范围的扫描效率,在某些需求下还可提高的外键的检索效率。

IOT 表是由一个基于表的主键构建的B*tree索引来组织的表。主键和其他的列都存储在B*tree索引的叶子块中。但将所有的列都存储在叶子块中可能会导致索引结构的性能下降,因为我们只能在每个叶子块中存储少量的记录。因此我们需要更多的叶子块,从而导致范围扫描的性能下降,甚至有可能提高索引的深度。为了避免性能下降,可以通过INCLUDING子句来指定只有部分列可以保存在叶子块中。表定义中INCLUDING未指定的列将会被存储到一个溢出段(overflow segment)中。
如果以常规的B*tree索引来查询,结构图如下(很丑,word里面画的): 

图片

如果是用包含溢出块的索引组织表。扫描结构图如下:

图片

明天将结合实际环境比较二者的性能差异。

============================END。  2013-05-27  23:10 =================================

配置溢出段

对于IOT来说,包含溢出段并不是必要的,但是这样做几乎总是值得的.,除非表上非主键列的数量的非常少.举例来说:
sys_staff表(公司项目的一个表,只包含了部分字段,没写全)
 CREATE TABLE sys_staff (
     staffid NUMBER NOT NULL,
     tenantid  NUMBER NOT NULL,
     staffname VARCHAR2(20) NOT NULL,
     age number NOT NULL,
     address VARCHAR(100) ,
      ..........
 PRIMARY KEY (staffid ,tenantid  )
)
ORGANIZATION INDEX INCLUDING  age OVERFLOW;
注意: INCLUDING age :表示age列(含)之前的所有列都存在在索引块中,age列之后的所有列都存储在溢出段中(关键字:OVERFLOW)。

下面来看看包含溢出段的IOT表结构:
图片

在来看看不包含溢出段的IOT表结构
图片

性能比较如下:下列横轴为表组织方式,纵轴为逻辑IO数量
图片
                 sys_staff表查询图-1   IOT表堆表的索引检索性能比较 
图片
                sys_staff表查询图-2  IOT表堆表的全表扫描性能比较

最后,给出选择最后的索引策略:
1. Oracle默认的索引类型(B*tree索引)适合提升大量查询的性能。B*tree索引可以优化青雀查找与范围查询,有时候还可以在不访问基础表的情况下处理查询。
2. 使用散列簇,可以用来提升精确查找的访问性能,但是无法提高范围查询的性能。要合理的配置参数HASHKEYSSIZE。理论公式如下(由于时间关系,这点没有实践,但还是相信理论的指导性与权威吧  哈哈)。理论公式如下:
     HASHKEYS = number_of_distinct_hash_keys_values
     SIZE = ( total_rows/HASHKEYS ) * average_row_length * 1.1
3. 在同时查询多个具有较低基数(很少有不同值,如性别,类别字段等)的列时,位图索引的优化效果会非常显著。
下一节,全面总结索引以及索引优化策略并配上实践结果。不早了,睡觉了。
======================== 2013-05-28 23:43 ===========================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值