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