索引組織表(
iot)有一種類
b樹的儲存組織方法。普通的堆組織表是以一種無序的集合儲存。而
iot中的資料是按主鍵有序的儲存在
b樹索引結構中。與一般
b樹索引不同的的是,在
iot中每個葉結點即有每行的主鍵列值,又有那些非主鍵列值。
如下圖所示,在
iot所對應的
b樹結構中,每個索引項包括
<
主鍵列值,非主鍵列值
>
而不是rowid
,對於普通堆組織表,
oracle
會有對應的索引與之對應,且分開儲存。換句話說,
iot即是索引,又是實際的資料。
普通表索引與表資料的對應關係
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 、二級索引:
也可理解為聚集索引,好比是我們人查字典時自已會使用的索引。
oracle中的索引組織表與堆組織表
建立乙個emp表 sql create table emp asselect object id empno,object name ename,created hiredate,owner job from all objects 受影響的行 53759 4.172ms sql解析 查詢all o...
oracle中的索引組織表與堆組織表
建立乙個emp表 sql create table emp asselect object id empno,object name ename,created hiredate,owner job from all objects 受影響的行 53759 4.172ms sql解析 查詢all o...
oracle中的索引組織表與堆組織表
建立乙個emp表 sql create table emp asselect object id empno,object name ename,created hiredate,owner job from all objects 受影響的行 53759 4.172ms sql解析 查詢all o...