索引组织表(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; 表已更改。