索引组织表(Index-Organized Table)是按B-树的结构来组织和存储数据的。与标准表中的数据时无序存放的不同,索引表中数据按主键值有序存储。

                叶子节点中存放的是表的主键值与所有非主键值,而不是B-树索引值与ROWID。由于整条记录都保存在索引表的叶子节点中,因此索引表不需要使用物理ROWID来确定记录的位置。

                只要知道主键的值,就可以找到相应记录的完整内容。Oracle也会为每个主键创建一个逻辑上的ROWID,其他的索引将使用逻辑ROWID来映射索引表中的记录。

1.索引表与标准表的比较

    (1)索引表中的ROWID列存放的是【逻辑】物理地址。而标准表的ROWID伪列中存储的则是真实的物理地址,这是两者之间最本质的区别。另外其他几个方面的差异都是因为有这个差异存在而存在。或者说,它是索引表优势的根源。 

    (2)索引表的主键约束是必须定义的,而标准表主键约束是可选的。

    (3)索引表通过全索引扫描按一定排序返回所有记录,而标准表是通过顺序全表扫描按一定排序返回所有记录

    (4)索引表不能是聚簇表,标准表可以是聚簇表。

    (5)索引表不能包含虚拟列

    (6)索引表只需要维护索引表一个存储结构,标准表需要维护表和索引两种

2.索引表的优点

     (1)可以基于主键的快速查询及范围查询,因为数据时按主键顺序组织的

     (2)表与索引没有分离,维护容易

     (3)需要较少的存储空间,可以避免主键重复。

3.索引表的溢出存储        

      普通B树索引条目一般比较小,因为在每个索引条目中仅保存索引列的值与ROWID的值。但是,因为索引表中的每个索引条目都包有整条地记录,所以,索引表中的索引条目就可能会很大。

为此,用户若在索引表中查询数据,其查询的只是其中一部分字段内容的话,索引表的效果就体现不出来。相反,若表中的字段比较多的话,则效果会适得其反。为此,在Oracle数据库中,

采用了溢出存储功能来应对索引表的这个缺陷。 

     如在一张员工基本信息表中,他有员工姓名、员工编号、员工出身年月、身份证号码、住址、户口、民族等信息,长达几十个字段。但是,在平时的时候,

我们基本上只需要查询员工的姓名、编号、身份证号码即可。而不需要其他的信息。 此时,当员工比较多的时候,就需要把这张表转换成索引表,然后采用溢出管理功能,来提高员工信息常用字段的查询速度。

把用户经常需要用到的员工姓名、编号、身份证号码等字段保存在叶子节点上。而把其他不常用的字段采取“溢出存储”策略。

 

创建索引表

    创建一个索引表admin_doindex,保存在users表空间内,溢出百分比为20? 溢出部分保存在TBS1中

SQL> create table admin_docindex(
  2  token char(20),
  3  doc_id number,
  4  token_frequency number,
  5  token_offsets varchar2(2000),
  6  constraint pk_admin_docindex primary key(token,doc_id))
  7  organization index                                             
  8  tablespace users
  9  pctthreshold 20 overflow tablespace TAS2;

表已创建。organization index:创建索引


pctthreshold 20:指定保留在索引段的索引条目中的记录的百分比
overflow tablespace TAS2:指定溢出的数据段的存储表空间

including :该字段保存在索引条目中

维护索引表
 1.修改admin_docindex的参数设置
SQL> alter table admin_docindex pctthreshold 15 including doc_id;

表已更改。

  




 posted on 2013-07-10 12:04  evencao  阅读(4043)  评论(0编辑  收藏  举报