平衡樹索引(b-tree index)

pingley發表於2012-04-08
平衡樹索引(b-tree index)
什麼是平衡樹索引與平衡樹索引的特性
平衡樹的組織形式是倒立的樹形。平衡樹中共有兩種節點(block),分支節點用來查詢查詢葉子節點的。葉子節點儲存鍵值與對應的記錄的rowid,即(key,rowid).分支節點中儲存了對key 的分組資訊與指向葉子節點的指標。葉子節點之間透過雙向指標連線起來。之所有叫做平衡樹是因為所有葉子節點的深度都相同。也正是因為這個特性,使得平衡樹在查詢任何一條記錄的時候所花的時間幾乎相同(讀取了相同數量的資料塊)。即使在不同記錄的表中的平衡樹索引檢索記錄的效率也差不多。平衡樹索引時資料庫中最常見的索引型別。
平衡樹的高度:指的是從根節點都葉子節點所經過的節點數。
分組節點的高度:等於平衡樹的高度減1。
注:以下所提索引均指平衡樹索引。
自動建立平衡樹索引
在一下的情景下會自動建立平衡樹索引(unique index):
1、在primary key 列上自動建立平衡樹索引。
2、在unique 上自動建立平衡樹索引。
如果primary key  和 unique 約束的列,和另外一個約束相關,那麼oracle 不一定自動建立索引。具體有沒有建立需要透過一些檢視來確定。在這些列上建立索引能夠提高查詢的效率,排序的效率,確定值是否唯一的效率,join的效率。如果需要在其他列建立唯一索引可以使用create unique index   語句。
使用平衡樹索引的注意事項
雖然索引可以加速資料的檢索,但是在一下情況下不一定總是適合的:
1、DML操作頻繁的表,因為在執行DML操作時還需要維護索引,所以會影響DML操作的效能,所以你需要考慮是查詢的效能重要還是DML操作的效能更重要。一般在OLTP系統中對DML操作的效能要求要高些,在OLAP系統中對查詢的要求高些。並不是說為了DML的效率就不要考慮使用索引而要進行平衡,或者為了DML的效率儘可能少的使用索引。
2、平衡樹索引典型的適用於查詢返回很小百分比的表資料。因為當需要檢索很多記錄時,使用索引可能需要執行額外的資料塊讀取(讀取完很多索引塊以後還需要讀取大量的表的資料塊)。對於返回的表記錄的百分比沒有一個通用的標準(一些準則認為是小於10%),最好的方式是進行測試。
3、典型情況下,小表不會受益於索引,因為往往直接進行全表掃描可能更快速,因為讀取的資料塊更少或者進行一次或者幾次聯絡的IO,比使用索引時進行零散的IO讀取更高效。
4、索引的維護需要考慮額外的儲存開銷。
在建立索引時要需要考慮索引要建在那個或者是那些列上面。通常建立在被where 子句頻繁使用的列,或者頻繁進行排序的列,常用來join 的列。對於用作排序的列可以根據排序的型別來建立(ASC 預設和DESC)的索引。在平衡樹索引中查詢不到索引列的值是null 的記錄,所以如果索引所在的列包含很多null  值的話,而你的查詢又要過濾掉這些null 值,這時候索引無疑是很有用的。如果你需要查詢的正是這些null 值那麼oracle 會進行全表掃描,不管平衡樹索引的存在。如果你希望透過使用索引來提高效能,可以考慮使用FBI。也可以建立複合的平衡樹索引來提高效能,當查詢條件經常中包括的columns 上建立了複合索引的時候可以提高該查詢的效能,在這種情況下維護一個複合索引比維護幾個單獨的索引更加的高效(讀取一個複合索引比讀取多個單獨的索引的IO次數少,另外查詢的結果不需要合併)。在複合索引中應該把頻繁使用的列放在建立索引語句的前面,這樣會更加高效。如果查詢條件中只包含複合索引中的一列也可以使用複合索引。(複合平衡樹索引最多隻能參照32列)。注:判斷索引是否有效的最好方法是進行測試。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26110315/viewspace-720655/,如需轉載,請註明出處,否則將追究法律責任。

相關文章