Oracle 索引組織表(IOT)

chuanzhongdu1發表於2011-10-28

索引組織表(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時,必須要設定主鍵,否則報錯。

    ● 索引組織表實際上將所有資料都放入了索引中。

 原文地址:http://blog.csdn.net/dnnyyq/article/details/5195472

 

索引組織表屬性

 

    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 ;

     overflow指定溢位資料存放的表空間

 

    ● 如上例所示,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 add overflow; --新增一個overflow

 

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

 

    alter table t88 pctthreshold 15 including name; --調整overflow的引數

    alter table t88 initrans 2 overflow initrans 4; --修改資料塊和溢位段的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、二級索引:也可理解為聚集索引,好比是我們人查字典時自已會使用的索引。

相關文章