索引组织表(IOT)

索引组织表会把表的存储结构改成B树结构,以表的主键进行排序。这种特殊的表和其他类型的表一样, 可以在表上执行所有的DML和DDL语句。由于表的特殊结构,ROWID并没有被关联到表的行上。
对于一些涉及精确匹配和范围搜索的语句,索引组织表提供了一种基于键的快速数据访问机制。基于主键值的UPDATE和DELETE语句的性能也同样得以提高,这是因为行在物理上有序。由于键列的值在表和索引中都没有重复,存储所需要的空间也随之减少。
如果不会频繁地根据主键列查询数据,则需要在索引组织表中的其他列上创建二级索引。不会频繁根据主键查询表的应用程序不会了解到使用索引组织表的全部优点。对于总是通过对主键的精确匹配或范围扫描进行访问的表,就需要考虑使用索引组织表。
l另外,可以在索引组织表上建立二级索引。

示例:
CREATE TABLE TEST_IOT
(
   A   NUMBER,
   B   NUMBER,
   C   NUMBER,
   D   VARCHAR2 (4000 BYTE),
   CONSTRAINT PK_TEST_IOT PRIMARY KEY (A, B)
)
ORGANIZATION INDEX
   TABLESPACE TEST1
PCTTHRESHOLD 25
   INCLUDING D
   OVERFLOW TABLESPACE TEST2

* pctthreshold 确定iot叶块中为iot行保留的空间百分比,有效值为0-50(default:50)
* including 确定iot块中保存到的切换点,只要其不超过pctthreshold.指定列之后的任何列存放在overflow表空间.
* overflow 这个字句指定iot行溢出部分的表空间和存储参数.过多的使用overflow表可能抵消性能.

一个iot是由一个index和一个table两个segment组成的,由于存在OVERFLOW,所以会自动创建一个存放OVERFLOW的table,系统自动命名。

SQL> select table_name, tablespace_name, iot_name
2    from user_tables
3   where table_name like '%IOT%';

TABLE_NAME                     TABLESPACE_NAME                IOT_NAME
------------------------------ ------------------------------ ------------------------------
SYS_IOT_OVER_11007             TEST2                          TEST_IOT
TEST_IOT                                                     
SQL> select segment_name, segment_type, tablespace_name
2    from user_segments
3   where segment_name like '%IOT%';

SEGMENT_NAME                                                                     SEGMENT_TYPE       TABLESPACE_NAME
-------------------------------------------------------------------------------- ------------------ ------------------------------
PK_TEST_IOT                                                                      INDEX              TEST1
SYS_IOT_OVER_11007                                                               TABLE              TEST2
SQL> select index_name, index_type, table_name
2    from user_indexes
3   where table_name = 'TEST_IOT';

INDEX_NAME                     INDEX_TYPE                  TABLE_NAME
------------------------------ --------------------------- ------------------------------
PK_TEST_IOT                    IOT - TOP                   TEST_IOT
SQL> select constraint_name, constraint_type, table_name, index_name
2    from user_constraints
3   where constraint_name like '%IOT%';

CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME                     INDEX_NAME
------------------------------ --------------- ------------------------------ ------------------------------
PK_TEST_IOT                    P               TEST_IOT                       PK_TEST_IOT

关于二级索引:
IOT也属于表的一种,只是它与堆表的区别仅仅是其中的数据按照主键已经进行排序了,并且标的逻辑结构与索引是相同的。可以说它既属于表,又有索引的结构。
既然它属于表,那么它当然也有建立索引的需求。由于它的索引的结构,比如说由于索引叶节点的分裂,行所在块可能会发生改变,因而建立在IOT上的索引和一般的索引的最大区别是它存的是IOT的行的逻辑地址,也就是UROWID,oracle用这个逻辑rowid来猜这个行所在的块,如果猜到了,那么这个urowid是正确的,否则它从这个地址向下遍历来找这条记录。
对普通表的数据访问通过索引(比如说很大的表取得很少的一部分纪录这种最普通的情况)访问数据大家都知道会加快,IOT也是这样的。比如说你的IOT表有 a,b,c3列,主键是a,这个表是按照a的顺序存储的,现在你的where条件又有很多是通过b(或者c)来访问的,那么在b(或者c)上来建立索引和 普通堆表也一样会更快地访问到想要的数据(虽说也有可能猜错)。如果你没建立索引,那么唯一的区的数据的方式只有全表扫描。

posted on 2009-07-20 17:36  dhj  阅读(343)  评论(0)    收藏  举报

导航