你是否了解Oracle B樹(shù)索引
在向大家詳細(xì)介紹Oracle B樹(shù)索引之前,首先讓大家了解下非唯一索引中,然后全面介紹Oracle B樹(shù)索引。Oracle B樹(shù)索引中不存在非唯一的條目。
在非唯一索引中,Oracle會(huì)把rowid作為一個(gè)額外的列追加到鍵上,使得鍵唯一。
Exp:create index I on T( x , y ) ,從概念上講就是Create unique index I on T(x , y , rowid)。Oracle會(huì)首先按索引鍵值排序,然后再按照rowid升序排序。
在唯一索引中,數(shù)據(jù)只按索引鍵值排序。
1.大多數(shù)情況下,Oracle B樹(shù)索引的高度都是2或者3,所以一般情況下,在索引中找到一個(gè)鍵只需要2或3次I/O。
2.Oracle B樹(shù)索引所有葉子塊都應(yīng)該在同一層上,并且葉子節(jié)點(diǎn)實(shí)際上都是雙向鏈表,這樣在進(jìn)行索引區(qū)間掃描(index range scan)的時(shí)候,只需通過(guò)葉子節(jié)點(diǎn)的向前或者向后就可以了,無(wú)需再對(duì)索引結(jié)構(gòu)進(jìn)行導(dǎo)航。
3.適當(dāng)對(duì)Oracle B樹(shù)索引存在重復(fù)值的列進(jìn)行壓縮, 可以增加緩存命中率,使I/O數(shù)減少,因?yàn)?BR>相關(guān)的條目可能都存在在一個(gè)塊中。(Exp:create index I on T(userid , username) username=’steven’這個(gè)值可能就會(huì)對(duì)應(yīng)于多個(gè)rowid放在同一個(gè)索引塊中);但是帶來(lái)的負(fù)面作用是使索引結(jié)構(gòu)復(fù)雜化,維護(hù)索引更耗時(shí),查詢索引占用CPU更多的時(shí)間。(壓縮適合用于多列索引中)
4.Oracle B樹(shù)索引的反向鍵索引主要用于緩解索引右側(cè)緩沖區(qū)忙等待。適合用于類似于sequence產(chǎn)生的PK主鍵上,因?yàn)檫@些列不太會(huì)需要使用區(qū)間掃描,也就是不會(huì)用到max(PK),min(PK),between and或者where PK < 200等查詢
5.如果在查詢中會(huì)有order by colum1 asc,column2 desc, 試著在創(chuàng)建索引時(shí)create index I on T(colum1 asc,column2 desc) , 因?yàn)镺racle INDEX默認(rèn)是DESC排序,在索引中排序總比在磁盤(pán)中排序好得多。
6.適合Oracle B樹(shù)索引使用的2種情況:
1)訪問(wèn)表中占很小比例的行
2)根本不訪問(wèn)表,所需查詢的數(shù)據(jù)全部在索引中
3)一種特殊的用法,使用索引訪問(wèn)表的全部行,這樣的做法是為了使查詢最初的響應(yīng)時(shí)間很短,不是針對(duì)總吞吐量進(jìn)行的優(yōu)化。
7.索引是按索引鍵順序存儲(chǔ),索引會(huì)按鍵的有序順序進(jìn)行訪問(wèn)。索引指向的塊則隨機(jī)存儲(chǔ)在堆中。
8.建議:在thin表中使用Oracle B樹(shù)索引查詢<2-3%的列,fat表中<20-25%的列。
【編輯推薦】