天天看點

初識oracle中的索引組織表

 索引組織表(IOT)有一種類B樹的存儲組織方法。普通的堆組織表是以一種無序的集合存儲。而IOT中的資料是按主鍵有序的存儲在B樹索引結構中。與一般B樹索引不同的的是,在IOT中每個葉結點即有每行的主鍵列值,又有那些非主鍵列值。

如下圖所示,在IOT所對應的B樹結構中,每個索引項包括<主鍵列值,非主鍵列值>而不是ROWID,對于普通堆組織表,oracle會有對應的索引與之對應,且分開存儲。換句話說,IOT即是索引,又是實際的資料。

初識oracle中的索引組織表

                               普通表索引與表資料的對應關系         

初識oracle中的索引組織表

                            IOT的索引項和表資料的對應關系

IOT 和普通表對于應用程式來說,例如 sql 查詢語句,是沒有差別的。也就是說 oracle 中對表的組織形式對應用來說是透明的。        下表總結了 IOT 與一般表的差別:    

普通表 IOT
ROWID 唯一确定一行錄 主鍵唯一确定一行記錄
可以不指定主鍵 必須指定主鍵
ROWID 僞列中儲存實體 rowid ,可以建構二級索引 ROWID 僞列中儲存邏輯 rowid ,可以建構二級索引
基于 rowid 進行通路 基于邏輯 rowid 進行通路
順序掃描才能得到所有行 隻須掃描索引即可傳回所有行
可以和其它表一起聚集存儲 不能存儲為聚集表
可以包含 long 和 lob 類型的列 可以包含 lob 類型但不可以包括 long 類型的列

  使用 IOT 的好處: 1 、由于索引項和資料存儲在一起,是以無論是基于主鍵的等值查詢還是範圍查詢都能大大節省磁盤通路時間。 2 、為了能夠更快地通路那些頻繁通路的列,可以使用溢出存儲選項将那些通路不頻繁的列放在 B 樹葉結點資料塊之外的溢出堆空間中。這樣一來便可以得到更小的 B 樹,以及包含更多行的葉結點 3 、和堆組織表和索引不同,主鍵不需要被存儲兩次。 4 、 ROWID 僞列是基于主鍵值的邏輯 rowid ,而不是實體 rowid ,即使表被重新組織過,造成了基表行的遷移,二級索引仍然可用,不需要重建。   注: 1 、 Oracle 使用 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 僞列不存儲在資料庫中 , 它不是資料庫表的資料 , (從 database 及 table 的邏輯結構來說)。事實上 , 在實體結構上 , 每行由一個或多個 row pieces 組成 , 每個 row piece 的頭部包含了這個 piece 的 address, 即 rowid. 從這個意義上來說, rowid 還是占了磁盤空間的 . 3 、二級索引: 也可了解為聚集索引,好比是我們人查字典時自已會使用的索引。