初識索引組織表(IOT)

初識oracle中的索引組織表
    索引組織表(IOT)有一種類B樹的存儲組織方法。普通的堆組織表是以一種無序的集合存儲。而IOT中的數據是按主鍵有序的存儲在B樹索引結構中。與一般B樹索引不同的的是,在IOT中每個葉結點即有每行的主鍵列值,又有那些非主鍵列值。
如下圖所示,在IOT所對應的B樹結構中,每個索引項包括<主鍵列值,非主鍵列值>而不是ROWID,對於普通堆組織表,oracle會有對應的索引與之對應,且分開存儲。換句話說,IOT即是索引,又是實際的數據。
                               普通表索引與表數據的對應關係
        
                            IOT的索引項和表數據的對應關係
IOT和普通表對於應用程序來說,例如sql查詢語句,是沒有區別的。也就是說oracle中對錶的組織形式對應用來說是透明的。
       下表總結了IOT與一般表的區別:

 

 

普通表
IOT
ROWID唯一確定一行錄
主鍵唯一確定一行記錄
可以不指定主鍵
必須指定主鍵
ROWID僞列中保存物理rowid,可以構建二級索引
ROWID僞列中保存邏輯rowid,可以構建二級索引

基於rowid進行訪問
基於邏輯rowid進行訪問
順序掃描才能得到所有行
只須掃描索引即可返回所有行
可以和其它表一起聚集存儲
不能存儲爲聚集表
可以包含longlob類型的列
可以包含lob類型但不可以包括long類型的列

 

使用IOT的好處:
1、由於索引項和數據存儲在一起,所以無論是基於主鍵的等值查詢還是範圍查詢都能大大節省磁盤訪問時間。
2、爲了能夠更快地訪問那些頻繁訪問的列,可以使用溢出存儲選項將那些訪問不頻繁的列放在B樹葉結點數據塊之外的溢出堆空間中。這樣一來便可以得到更小的B樹,以及包含更多行的葉結點
3、和堆組織表和索引不同,主鍵不需要被存儲兩次。
4ROWID僞列是基於主鍵值的邏輯rowid,而不是物理rowid,即使表被重新組織過,造成了基錶行的遷移,二級索引仍然可用,不需要重建。
 
 
注:
1Oracle使用rowid數據類型存儲行地址,rowid可以分成兩種,分別適於不同的對象,Physical rowids:存儲ordinary table,clustered table,table partition and subpartition,indexe,index partition and subpartition;Logical rowids :存儲IOT的行地址
2、每個表在oracle內部都有一個ROWID僞列,它在所有sql中無法顯示,不佔存儲空間;它用於從表中查詢行的地址或者在where中進行參照,一個例子如下:
    SELECT ROWID, last_name FROM employees;          Oracle內部使用保留在ROWID僞列中的值構建索引結構,rowid僞列不存儲在數據庫,它不是數據庫表的數據,(從databasetable的邏輯結構來說)。事實上,在物理結構上,每行由一個或多個row pieces組成,每個row piece的頭部包含了這個pieceaddress,rowid.從這個意義上來說,rowid還是佔了磁盤空間的.
3、二級索引:

也可理解爲聚集索引,好比是我們人查字典時自已會使用的索引。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章