索引组织表(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)上来建立索引和普通堆表也一样会更快地访问到想要的数据(虽说也有可能猜错)。如果你没建立索引,那么唯一的区的数据的方式只有全表扫描

 

索引组织表的调整问题

类似于索引,在插入、更新和删除值时,IOT可能会逐渐在内部产生存储碎片。为了重新构建IOT,可以使用alter table命令的move子句。在下面的示例中,重新构建了EMPLOYEE_IOT表及其溢出区域:

alter table EMPLOYEE_IOT



move tablespace DATA



overflow tablespace DATA_OVERFLOW;

应该避免在IOT中存储长行的数据。一般来说,如果数据长度超过数据库块大小的75%,则应该避免使用IOT。如果数据库块大小是4KB,并且行的 长度超出3KB,则应该考虑使用普通表和索引,而不是使用IOT。行越长,针对IOT执行的事务越多,就越需要频繁地重新构建IOT。

注意:

在IOT中不可以使用LONG数据类型,但可以使用LOB。

本章前面提及,索引影响数据加载速率。为了获得最佳的结果,索引组织表的主键索引应该和连续的值一起加载,从而最小化索引管理的成本。

 

重要:关于使用索引组织表的建议:http://topic.csdn.net/t/20021223/17/1292463.html

索引组织表和堆表的比较:http://database.e800.com.cn/articles/2008/619/1213820712562973057_1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值