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. 使用散列簇,可以用来提升精确查找的访问性能,但是无法提高范围查询的性能。要合理的配置参数HASHKEYS与SIZE。理论公式如下(由于时间关系,这点没有实践,但还是相信理论的指导性与权威吧 哈哈)。理论公式如下:
HASHKEYS = number_of_distinct_hash_keys_values
SIZE = ( total_rows/HASHKEYS ) * average_row_length * 1.1
3. 在同时查询多个具有较低基数(很少有不同值,如性别,类别字段等)的列时,位图索引的优化效果会非常显著。
下一节,全面总结索引以及索引优化策略并配上实践结果。不早了,睡觉了。
======================== 2013-05-28 23:43 ===========================
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. 使用散列簇,可以用来提升精确查找的访问性能,但是无法提高范围查询的性能。要合理的配置参数HASHKEYS与SIZE。理论公式如下(由于时间关系,这点没有实践,但还是相信理论的指导性与权威吧 哈哈)。理论公式如下:
HASHKEYS = number_of_distinct_hash_keys_values
SIZE = ( total_rows/HASHKEYS ) * average_row_length * 1.1
3. 在同时查询多个具有较低基数(很少有不同值,如性别,类别字段等)的列时,位图索引的优化效果会非常显著。
下一节,全面总结索引以及索引优化策略并配上实践结果。不早了,睡觉了。
======================== 2013-05-28 23:43 ===========================