初識oracle中的索引組織表
2024-08-29 13:53:39
供稿:網(wǎng)友
索引組織表(IOT)有一種類B樹的存儲組織方法。普通的堆組織表是以一種無序的集合存儲。而IOT中的數(shù)據(jù)是按主鍵有序的存儲在B樹索引結構中。與一般B樹索引不同的的是,在IOT中每個葉結點即有每行的主鍵列值,又有那些非主鍵列值。
如下圖所示,在IOT所對應的B樹結構中,每個索引項包括<主鍵列值,非主鍵列值>而不是ROWID,對于普通堆組織表,Oracle會有對應的索引與之對應,且分開存儲。換句話說,IOT即是索引,又是實際的數(shù)據(jù)。
普通表索引與表數(shù)據(jù)的對應關系
IOT的索引項和表數(shù)據(jù)的對應關系
IOT和普通表對于應用程序來說,例如sql查詢語句,是沒有區(qū)別的。也就是說oracle中對表的組織形式對應用來說是透明的。
下表總結了IOT與一般表的區(qū)別:
普通表 IOT
ROWID唯一確定一行錄 主鍵唯一確定一行記錄
可以不指定主鍵 必須指定主鍵
ROWID偽列中保存物理rowid,可以構建二級索引 ROWID偽列中保存邏輯rowid,可以構建二級索引
基于rowid進行訪問 基于邏輯rowid進行訪問
順序掃描才能得到所有行 只須掃描索引即可返回所有行
可以和其它表一起聚集存儲 不能存儲為聚集表
可以包含long和lob類型的列 可以包含lob類型但不可以包括long類型的列
使用IOT的好處:
1、由于索引項和數(shù)據(jù)存儲在一起,所以無論是基于主鍵的等值查詢還是范圍查詢都能大大節(jié)省磁盤訪問時間。
2、為了能夠更快地訪問那些頻繁訪問的列,可以使用溢出存儲選項將那些訪問不頻繁的列放在B樹葉結點數(shù)據(jù)塊之外的溢出堆空間中。這樣一來便可以得到更小的B樹,以及包含更多行的葉結點
3、和堆組織表和索引不同,主鍵不需要被存儲兩次。
4、ROWID偽列是基于主鍵值的邏輯rowid,而不是物理rowid,即使表被重新組織過,造成了基表行的遷移,二級索引仍然可用,不需要重建。
注:
1、Oracle使用rowid數(shù)據(jù)類型存儲行地址,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偽列不存儲在數(shù)據(jù)庫中,它不是數(shù)據(jù)庫表的數(shù)據(jù),(從database及table的邏輯結構來說)。事實上,在物理結構上,每行由一個或多個row pieces組成,每個row piece的頭部包含了這個piece的address,即rowid.從這個意義上來說,rowid還是占了磁盤空間的.
3、二級索引:也可理解為聚集索引,好比是我們人查字典時自已會使用的索引。