IOT(Index Organized Table)
??? 我們知道一般的表都以堆(heap)的形式來(lái)組織的,這是無(wú)序的組織方式。Oracle還提供了一種有序的表,它就是索引組織表,簡(jiǎn)稱IOT表。IOT表上必須要有主鍵,而IOT表本身不對(duì)應(yīng)segment,表里所有的數(shù)據(jù)都存放在主鍵所在的索引的葉子節(jié)點(diǎn)里。換句話說(shuō),在索引葉子節(jié)點(diǎn)里的索引條目里不僅存放了被索引的列的值,還同時(shí)存放了其他列的值。
??? 對(duì)于總是通過(guò)主鍵訪問(wèn)數(shù)據(jù)的表來(lái)說(shuō),比較適合使用IOT表。如果使用普通表,則通過(guò)主鍵索引訪問(wèn)表時(shí),至少要讀取兩個(gè)數(shù)據(jù)塊:一個(gè)索引塊,另一個(gè)是表的數(shù)據(jù)塊。而如果通過(guò)IOT表,由于表的數(shù)據(jù)就存放在索引塊中,所以只需要讀取一個(gè)塊即可。IOT表時(shí)虛擬表,但是他具有普通表所有的特性。而且盡管IOT表的數(shù)據(jù)實(shí)際存放在索引segment里,但是我們還是可以在IOT表的基礎(chǔ)上,在其他列上再次創(chuàng)建索引,這種索引我們叫二級(jí)索引。
使用二級(jí)索引查找數(shù)據(jù)時(shí),存在以下兩個(gè)階段:
1,物理猜測(cè):根據(jù)二級(jí)索引里記錄的物理ROWID,去掃描其指向的IOT表所依附的索引segment里的索引節(jié)點(diǎn)。
2,邏輯猜測(cè):由于IOT表的數(shù)據(jù)存放在索引的葉子節(jié)點(diǎn)里,而由于在索引里數(shù)據(jù)都是有序存放的,數(shù)據(jù)會(huì)子會(huì)在葉子節(jié)點(diǎn)中間插入,因此就存在向葉子節(jié)點(diǎn)的拆分問(wèn)題。一旦葉子節(jié)點(diǎn)被拆分,數(shù)據(jù)所在的索引塊就會(huì)變化,那么二級(jí)索引所指向的位置也就錯(cuò)誤了。通過(guò)物理ROWID去訪問(wèn)IOT表就找不到數(shù)據(jù)。這個(gè)時(shí)候,Oracle會(huì)進(jìn)行邏輯猜測(cè),這時(shí)就不使用ROWID了,而是使用主鍵列的值去掃描IOT表。
?
創(chuàng)建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表時(shí),必須創(chuàng)建一個(gè)主鍵約束,然后指定organization index選項(xiàng),可以同時(shí)指定主鍵對(duì)應(yīng)的索引所在的表空間名稱。從上面的例子中,假設(shè)經(jīng)常訪問(wèn)的列id和c1這兩個(gè)列,則如果把其他的c2,c3,c4列也放在索引塊里,會(huì)比較浪費(fèi)空間。因?yàn)檫@三列并不經(jīng)常被訪問(wèn),沒(méi)有必要把他們與id,c1放在一起。于是我么就可以通過(guò)設(shè)置pctthreshold和including這兩個(gè)屬性,從而只在索引塊里存放id和c1,而且他的三列在放入overflow里,(overflow是一種segment).
?
pctthreshold說(shuō)明留在索引塊里的數(shù)據(jù)空間占總數(shù)據(jù)塊大小的百分比,從0到50%。假設(shè)在IOT_TEST表中,id列和c1列總共大概需要400個(gè)字節(jié),索引塊大小為8kB,我們希望ID列和C1列留在索引塊里。則留在索引塊里的數(shù)據(jù)占整個(gè)索引塊大小的5%(500/8192),于是可以將pctthreshold設(shè)置為5.我們還可以使用including,對(duì)于上面的例子來(lái)說(shuō),including c2表示從C2列開(kāi)始,后面所有的列(也就是C2,C3,C4這三列)都放到overflow里。優(yōu)先考慮pctthreshold,也就是說(shuō)如果id列的值占數(shù)據(jù)塊大小的百分比已經(jīng)超過(guò)了指定的pctthreshold,則盡管指定的是從C2列開(kāi)始后面的所有列都放入OVERFLOW,但是由于違反了pctthreshold,則C1以后的列也都全部放入overflow里(即c1,c2,c3,c4都放入overflow里)
?
?
總結(jié)
以上是生活随笔為你收集整理的IOT(Index Organized Table)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 梦到奇怪的树是什么意思
- 下一篇: 测试使用wiz来发布blog