堆組織表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樹,以及包含更多行的葉結點