索引组织表(index organized table ,IOT)默认情况下所有的表都是堆组织表,对表中的记录不进行排序。堆组织表通过rowid 来访问(定位)表中的记录。IOT 使用b-tree index 的结构存储记录。逻辑上按照主键排序,和正常的主键索引不同的是,主键索引仅仅是存储定义列的值。IOT index 存储所有IOT表中所有的列,并按照主键排序。索引和表合二为一,存储在同一个数据库对象中。表中记录的访问也不是通过传统的rowid来现实,而是通过主键来访问。创建IOTIOT中需要存在主键,并且在创建IOT的语句中使用organization index 子句。创建一个堆组织表,并且给定主键约束的名称方便后面的查找和标识。SQL> create table test_iot 2 ( id number(3),name varchar2(12), 3 constraints test_iot_id#_pk primary key (id)) 4 organization index;Table created.查看刚才创建的IOT中的索引。SQL> select index_name,index_type,table_name,table_type 2 from user_indexes 3 where table_name = ‘TEST_IOT’;INDEX_NAME INDEX_TYPE TABLE_NAME TABLE_TYPE————— ————— ————— ———–TEST_IOT_ID#_PK IOT – TOP TEST_IOT TABLE堆组织表中的索引与主键的约束同名。下面这个查询进一步说明堆组织表中索引所在的列。SQL> select index_name,table_name,column_name 2 from user_ind_columns 3 where table_name = ‘TEST_IOT’;INDEX_NAME TABLE_NAME COLUMN_NAME————— ————— ——————–TEST_IOT_ID#_PK TEST_IOT ID查看因为创建堆组织表产生的数据库对象。QL> select object_id,object_name,object_type 2 from user_objects 3 order by object_id desc; OBJECT_ID OBJECT_NAME OBJECT_TYPE———- ————————- ——————- 69350 TEST_IOT_ID#_PK INDEX 69349 TEST_IOT TABLE查看数据库分配给堆组织表的segment。如果我们给主键约束起了名字那么堆组织表的segment name 和主键约束的名称相同,否则会使用系统默认的段名 SYS_IOT_TOP_<object_id>SQL> select segment_name,segment_type 2 from user_segments 3 where segment_name like ‘T%’;SEGMENT_NAME SEGMENT_TYPE————————- ——————TEST_IOT_ID#_PK INDEX堆组织表是没有 table segment 的。IOT 的优势在SQL语句的查询条件中经常需要使用到表中的主键这种情况下使用IOT可以实现更好的性能更快的访问速度。另外索引和表合二为一,只用一个segment 并且不需要存储rowid,只存储一遍primary key values 所有可以节省存储开销。关于overflow area如果在堆组织表中的一些列是不经常访问的,或者记录很长应该考虑使用overflow area.把这部分不常用的数据存放在overflow segment 中。可以使用index segment 比较小,从而在检索index segment 中的数据时性能更好。注:primary key values 总是存储在index segment中的,no-key values 可以存储在index segment 中也可以存储在overflow segment 中。index segment 中的row通过rowid 来连接到overflow segment 中的row.所以select 与DML语句不能直接的访问overflow 中的数据。overflow segment 的类型是table not index.创建带overflow area 的IOT首先来认识两个很重要的overflow 子句:overflow pctthreshold 子句 : 指定index block 中保留的空间的百分比。该百分比需要设置的合理,以便能够有足够的空间来存放primary key values.其他的列,如果存储在index block 中操作了指定的阀值,将不会存储在index block 中,而是存储在overflow segment 中。语法格式是:pctthreshold threshold threshold in(1…50),默认值是50.overflow including 子句:指定那些列应该存储在index block 中。语法格式是:including column_name这里的column_name 可以是最后一个primary key 列,也可以是no primary key 列。创建一个带overflow area 的堆组织表,其中id,first_name,last_name 存放在index block 中,其他的列存放在overflow segment 的block中。SQL> create table test_iot_info 2 ( id number (5), 3 first_name varchar2 (20), 4 last_name varchar2 (20), 5 major varchar2 (30), 6 current_credits number(3), 7 grade varchar2(2), 8 constraints test_iot_info_id#_pk primary key (id)) 9 organization index 10 overflow including last_name;Table created.查看刚才新建的IOT的索引信息SQL> select index_name,index_type,table_name 2 from user_indexes 3 where table_name = ‘TEST_IOT_INFO’;INDEX_NAME INDEX_TYPE TABLE_NAME————— ————— ——————————TEST_IOT_INFO_ID#_PK IOT – TOP TEST_IOT_INFOSQL> select index_name,table_name,column_name 2 from user_ind_columns 3 where table_name = ‘TEST_IOT_INFO’;INDEX_NAME TABLE_NAME COLUMN_NAME————— —————————— —————TEST_IOT_INFO_ID#_PK TEST_IOT_INFO ID查看由创建IOT 所生成的对象,这里因为使用了overflow 所以多出了一个 SYS_IOT_OVER_69353. overflow 的命名格式是 SYS_IOT_OVER_<table object_id>.SQL> select object_id,object_name,object_type 2 from user_objects 3 order by object_id desc; OBJECT_ID OBJECT_NAME OBJECT_TYPE———- —————————— ——————- 69355 TEST_IOT_INFO_ID#_PK INDEX 69354 SYS_IOT_OVER_69353 TABLE 69353 TEST_IOT_INFO TABLE查看由创建IOT 表生成的segment。SQL> select segment_name,segment_type 2 from user_segments 3 order by segment_name;SEGMENT_NAME SEGMENT_TYPE————————- ——————SYS_IOT_OVER_69353 TABLETEST_IOT_INFO_ID#_PK INDEX注意 IOT 表的overflow segment name 与 对象名相同。
索引组织表(index organized table ,IOT)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。