堆组织表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树,以及包含更多行的叶结点