Oracle之索引組織表

2021-08-09 21:38:59 字數 3052 閱讀 8810

假設表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...