0
点赞
收藏
分享

微信扫一扫

IOT表和堆组织表


 堆组织表Oracle里建立普通表的一种组织结构 

 

比如 
我们建立这样一个表 

create table test_iot 
( id int primary key,
value varchar2(100)
)

这里就是一个普通的堆组织表,

建表的时候会为主键id上建立基于B+树的索引,不过只对该列的数据进行索引,而不会在index里有value的信息,并且对于数据的存储来说无,是无序的数据集合。 

SQL> insert into test_iot values(1, '1'); 
1 row created.
SQL> insert into test_iot values(2, '1');
1 row created.
SQL> insert into test_iot values(4, '1');
1 row created.
SQL> insert into test_iot values(3, '1');
1 row created.

SQL> select * from test_iot;

ID VALUE


---------- ---------- 
1 1 
2 1 
4 1 
3 1 

我们可以插入数据看看,这个插入的顺序是无序的。 

索引组织表(IOT)有一种类B树的存储组织方法。普通的堆组织表是以一种无序的集合存储。而IOT中的数据是按主键有序的存储在B树索引结构中。与一般B树索引不同的的是,在IOT中每个叶结点即有每行的主键列值,又有那些非主键列值。Oracle里通过organization index来指定是一个IOT 

create table test_iot_1 
( id int primary key, 
value varchar2(100) 

organization index; 

SQL> insert into test_iot_1 values(1, '1'); 
1 row created. 
SQL> insert into test_iot_1 values(3, '1'); 
1 row created. 
SQL> insert into test_iot_1 values(2, '1'); 
1 row created. 
SQL> insert into test_iot_1 values(5, '1'); 
1 row created. 

SQL> select * from test_iot_1; 

ID VALUE 
---------- ---------- 
1 1 
2 1 
3 1 
5 1 

这里已经有顺序了 

这里在Rowid上两者也因为组织结构的不同导致差异 
对于普通的堆表用的物理Rowid,而IOT表是用的逻辑Rowid 

SQL> select a.*, rowid from test_iot a; 

ID VALUE ROWID 
---------- ---------- ------------------ 
1 1 AAALmBAAOAAAaXCAAA 
2 1 AAALmBAAOAAAaXCAAB 
4 1 AAALmBAAOAAAaXCAAC 
3 1 AAALmBAAOAAAaXCAAD 

SQL> select a.*, rowid from test_iot_1 a; 

ID VALUE ROWID 
---------- ---------- -------------------- 
1 1 *BAOBpboCwQL+ 
2 1 *BAOBpboCwQP+ 
3 1 *BAOBpboCwQT+ 
4 1 *BAOBpboCwQX+ 
5 1 *BAOBpboCwQb+ 

IOT的结构也决定了其在某些方面优于堆组织表 

 

IOT表主键和值在一起,主键不需要被存储两次,节省空间

IOT索引项和数据存储在一起,所以我们提到的主键覆盖在IOT里已经是可以达到了,主键里已经带了其他字段的信息,所以查询非主键覆盖的情况下能大大节省磁盘访问时间。 

由于IOT已经是有序的结构,所以定位明显比普通的对组织表要快。一来便可以得到更小的B树,以及包含更多行的叶结点 

举报

相关推荐

0 条评论