IOT(Index Organized Table)

來源:互聯網
上載者:User

    我們知道一般的表都以堆(heap)的形式來組織的,這是無序的組織方式。Oracle還提供了一種有序的表,它就是索引組織表,簡稱IOT表。IOT表上必須要有主鍵,而IOT表本身不對應segment,表裡所有的資料都存放在主鍵所在的索引的葉子節點裡。換句話說,在索引葉子節點裡的索引條目裡不僅存放了被索引的列的值,還同時存放了其他列的值。
    對於總是通過主鍵訪問資料的表來說,比較適合使用IOT表。如果使用普通表,則通過主鍵索引訪問表時,至少要讀取兩個資料區塊:一個索引塊,另一個是表的資料區塊。而如果通過IOT表,由於表的資料就存放在索引塊中,所以只需要讀取一個塊即可。IOT表時虛擬表,但是他具有普通表所有的特性。而且儘管IOT表的資料實際存放在索引segment裡,但是我們還是可以在IOT表的基礎上,在其他列上再次建立索引,這種索引我們叫二級索引。

使用二級索引尋找資料時,存在以下兩個階段:
1,物理猜測:根據二級索引裡記錄的物理ROWID,去掃描其指向的IOT表所依附的索引segment裡的索引節點。
2,邏輯猜測:由於IOT表的資料存放在索引的葉子節點裡,而由於在索引裡資料都是有序存放的,資料會子會在葉子節點中間插入,因此就存在向葉子節點的拆分問題。一旦葉子節點被拆分,資料所在的索引塊就會變化,那麼二級索引所指向的位置也就錯誤了。通過物理ROWID去訪問IOT表就找不到資料。這個時候,Oracle會進行邏輯猜測,這時就不使用ROWID了,而是使用主鍵列的值去掃描IOT表。

 

建立IOT表的例子如下:
create table iot_test(id number,c1 varchar2(40),c2 varchar2(40),c3 varchar2(40),c4 varchar2(40),primary key(id))
organization index
tablespace indx
pctthreshold 10
including c2
overflow tablespace users;

 

我們定義的IOT表時,必須建立一個主鍵約束,然後指定organization index選項,可以同時指定主鍵對應的索引所在的資料表空間名稱。從上面的例子中,假設經常訪問的列id和c1這兩個列,則如果把其他的c2,c3,c4列也放在索引塊裡,會比較浪費空間。因為這三列並不經常被訪問,沒有必要把他們與id,c1放在一起。於是我麼就可以通過設定pctthreshold和including這兩個屬性,從而只在索引塊裡存放id和c1,而且他的三列在放入overflow裡,(overflow是一種segment).

 

pctthreshold說明留在索引塊裡的資料空間佔總資料區塊大小的百分比,從0到50%。假設在IOT_TEST表中,id列和c1列總共大概需要400個位元組,索引塊大小為8kB,我們希望ID列和C1列留在索引塊裡。則留在索引塊裡的資料占整個索引塊大小的5%(500/8192),於是可以將pctthreshold設定為5.我們還可以使用including,對於上面的例子來說,including c2表示從C2列開始,後面所有的列(也就是C2,C3,C4這三列)都放到overflow裡。優先考慮pctthreshold,也就是說如果id列的值占資料區塊大小的百分比已經超過了指定的pctthreshold,則儘管指定的是從C2列開始後面的所有列都放入OVERFLOW,但是由於違反了pctthreshold,則C1以後的列也都全部放入overflow裡(即c1,c2,c3,c4都放入overflow裡)
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.