Oracle 索引組織表(IOT)

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

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

 

    索引組織表(IOT)不僅可以存儲數據,還可以存儲爲表建立的索引。索引組織表的數據是根據主鍵排序後的順序進行排列的,這樣就提高了訪問的速度。但是這是由犧牲插入和更新性能爲代價的(每次寫入和更新後都要重新進行重新排序)。

     索引組織表的創建格式如下:

    create table indexTable(

       ID varchar2 ( 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(

       ID varchar2 ( 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語句來更改溢出段的屬性。

 

    altertable t88 addoverflow--新增一個overflow

 

    ● 要ALTER任何OVERVIEW的屬性,都必須先定義overflow,若建表時沒有可以新增

 

    altertable t88 pctthreshold15includingname--調整overflow的參數

    altertable t88 initrans2overflowinitrans4--修改數據塊和溢出段的initrans特性

 

    ● 關於initrans的概念參考 http://space.itpub.net/265709/viewspace-166534

 

 

索引組織表的應用


    Heap Table 就是一般的表,獲取表中的數據是按命中率來得到的。沒有明確的先後之分,在進行全表掃描的時候,並不是先插入的數據就先獲取。數據的存放也是隨機的,當然根據可用空閒的空間來決定。

 

     IOT 就是類似一個全是索引的表,表中的所有字段都放在索引上,所以就等於是約定了數據存放的時候是按照嚴格規定的,在數據插入以前其實就已經確定了其位置,所以不管插入的先後順序,它在那個物理上的那個位置與插入的先後順序無關。這樣在進行查詢的時候就可以少訪問很多blocks,但是插入的時候,速度就比普通的表要慢一些。
適用於信息檢索、空間和OLAP程序。

 

    索引組織表的適用情況:
    1、 代碼查找表。
    2、 經常通過主碼訪問的表。
    3、 構建自己的索引結構。
    4、 加強數據的共同定位,要數據按特定順序物理存儲。
    5、 經常用between…and…對主碼或唯一碼進行查詢。
數據物理上分類查詢。如一張訂單表,按日期裝載數據,想查單個客戶不同時期的訂貨和統計情況。

 

    經常更新的表當然不適合IOT,因爲oracle需要不斷維護索引,而且由於字段多索引成本就大。

 

    如果不是經常使用主鍵訪問表,就不要使用IOT

 

     IOT和普通表對於應用程序來說,例如sql查詢語句,是沒有區別的。也就是說oracle中對錶的組織形式對應用來說是透明的。
使用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、二級索引:也可理解爲聚集索引,好比是我們人查字典時自已會使用的索引。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章