假設表a,有5個字段,其中有乙個名為id的字段為主鍵。日常業務中,經常需要根據id欄位的值,查詢該錶上其它字段(乙個或多個字段,甚至全部字段)上的值。如果我們只在id列上建立索引,當執行
select id,欄位2,欄位3,...
from 表a
where id=(>,<,>=,<=等邏輯操作)***;
時,如果結果集是少數記錄,那麼極可能是通過id列上的索引獲取rowid,然後回表去讀取相應rowid的行記錄,以獲取其它欄位上的資訊。如果這種業務很頻繁,為了這個回表的操作就可能帶來不小的效能提公升。所以,我們很自然的會想到用復合索引,把id列以外的其它列都編進去,這樣就不需要回表了,因為索引中這些列都已經有了。但這樣一來,索引的大小幾乎與表一樣大了,相當於在資料庫裡同時擁有兩張表a,只不過乙個是根據id排了序的,乙個是未排序的。這時,如果我們用索引組織表,那麼資料庫就會以索引的方式來儲存表a,資料庫中只有一張表的空間使用,不僅節省了空間,而且查詢的效能上與建立復合索引的方法有近似的提公升。
但是,索引組織表也有弱點,由於這種表是以索引的方式來儲存表中的資料,所以,索引葉子塊中會儲存相應行中所有欄位的值。若這些欄位的長度累計較大時,每個葉子塊可以儲存的行數就會很少,就會需要更多的葉子塊來儲存行記錄,而葉子塊越多,索引的深度(或層級)就越高,每次訪問時需要訪問的分支塊就越多,即一次訪問需要訪問的總的資料塊也就越多。當過多時,就會把消除回表操作所帶來的好處抵消,基至有過之而無不及,效能反而會更差。同時,如果索引組織表的主鍵值經常更改,意味著相應的行就需要在不同的塊之間進行移動。如果索引組織表頻繁進行增刪改,也會像索引那樣,引起索引結構的維護工作(比如分支塊的**,索引層級的增加,以及索引碎片的出現等)增加,也會引起效能的下降。
總結:索引組織表:以索引的方式儲存該錶,類似復合索引的用法
缺點:索引塊儲存所有的字段的資訊,如果字段長度過大,每個塊的存放數量有限,就需要更多的葉子來儲存資料,造成訪問效率降低。
如果主鍵頻繁修改,對應的行業就需要盤頻繁修改,行需要在不同的塊之間相互移動。
綜上,一般情況下,只有在滿足以下條件時,才應該考慮使用索引組織表:
1、表的寬度(即一行的資料長度)有限。
2、表的主鍵不會或極少更改。
3、表主要用於查詢,dml操作較少。
4、大部分的業務需求是根據主鍵查詢行中其它列上的資訊。
索引組織表(iot)不僅可以儲存資料,還可以儲存為表建立的索引。索引組織表的資料是根據主鍵排序後的順序進行排列的,這樣就提高了訪問的速度。但是這是由犧牲插入和更新效能為代價的(每次寫入和更新後都要重新進行重新排序)。
索引組織表的建立格式如下:
create table
indextable(
idvarchar2(10
), name
varchar2(20
), constraint
pk_id
primary
key(id)
)organization
index
;式注意兩點:
● 建立iot時,必須要設定主鍵,否則報錯。
● 索引組織表實際上將所有資料都放入了索引中。
索引組織表屬性
1、overflow子句(行溢位)
因為所有資料都放入索引,所以當表的資料量很大時,會降低索引組織表的查詢效能。此時設定溢位段將主鍵和溢位資料分開來儲存以提高效率。溢位段的設定有兩種格式:
pctthreshold n :制定乙個資料塊的百分比,當行資料占用大小超出時,該行的其他列資料放入溢位段
including column_name :指定列之前的列都放入索引塊,之後的列都放到溢位段
● 當行中某字段的資料量無法確定時使用pctthreshold。
● 若所有行均超出pctthreshold規定大小,則考慮使用including。
create table
t88(
idvarchar2(10
), name
varchar2(20
), constraint
pk_id
primary
key(id)
)organization index
pctthreshold 20
overflow tablespace
users
including name;
● 如上例所示,name及之後的列必然被放入溢位列,而其他列根據 pctthreshold
規則。2、compress子句(鍵壓縮)與普通的索引一樣,索引組織表也可以使用compress子句進行鍵壓縮以消除重複值。
具體的操作是,在organization index之後加上compress
n子句● n的意義在於:指定壓縮的列數。預設為無窮大。
例如對於資料(1,2,3)、(1,2,4)、(1,2,5)、(1,3,4)、(1,3,5)時
若使用compress則會將重複出現的(1,2)、(1,3)進行壓縮
若使用compress 1時,只對資料(1)進行壓縮
索引組織表的維護
索引組織表可以和普通堆表一樣進行insert、update、delete、select操作。
可使用alter table ... overflow語句來更改溢位段的屬性。
alter
table
t88
addoverflow
; --新增乙個overflow
● 要alter任何overview的屬性,都必須先定義overflow,若建表時沒有可以新增
alter
table
t88
pctthreshold
15including
name
; --調整overflow的引數
alter
table
t88
initrans
2overflow
initrans
4; --修改資料塊和溢位段的initrans特性
● 關於initrans的概念參考
Oracle 索引組織表(IOT)
索引組織表 iot 有一種類b樹的儲存組織方法。普通的堆組織表是以一種無序的集合儲存。而iot中的資料是按主鍵有序的儲存在b樹索引結構中。與一般b樹索引不同的的是,在iot中每個葉結點即有每行的主鍵列值,又有那些非主鍵列值。在iot所對應的b樹結構中,每個索引項包括 主鍵列值,非主鍵列值 而不是ro...
Oracle 索引組織表(IOT)
索引組織表 iot 有一種類b樹的儲存組織方法。普通的堆組織表是以一種無序的集合儲存。而iot中的資料是按主鍵有序的儲存在b樹索引結構中。與一般b樹索引不同的的是,在iot中每個葉結點即有每行的主鍵列值,又有那些非主鍵列值。在iot所對應的b樹結構中,每個索引項包括 主鍵列值,非主鍵列值 而不是ro...
Oracle 索引組織表(IOT)
索引組織表 iot 有一種類b樹的儲存組織方法。普通的堆組織表是以一種無序的集合儲存。而iot中的資料是按主鍵有序的儲存在b樹索引結構中。與一般b樹索引不同的的是,在iot中每個葉結點即有每行的主鍵列值,又有那些非主鍵列值。在iot所對應的b樹結構中,每個索引項包括 主鍵列值,非主鍵列值 而不是ro...