oracle b_tree索引、hash索引區別解析


  1. B 樹索引(B-Tree索引)

    1. B樹索引是我們在 oracle數據庫中最常用的索引,在詳細介紹訪問方法之前,我們看一下B-TREE索引的結構(圖片來源網絡)
                oracle的B樹索引就好像一顆長到的樹,他包含兩種類型,一種是索引分支塊(根節點塊,分支節點塊)一種是索引葉子塊(葉子節點塊)。分節點用來搜索,葉子節點用來存儲數據。根節點存儲索引的低層分支節點的數據。 由於所有的葉子節點均會自動的存儲成相同的深度,所以稱為“平 衡樹索引”, 故此,從任何葉子處檢索數據消耗的時間都是相同的。
      •   對於分支節點塊(包含跟節點塊)來說,索引條目(記錄)默認按照升序排列可指定為降序。每個索引條目包含兩個字段,一個是當前分支節點塊中所鏈接的索引塊中包含的最小鍵值,另一個是鏈接的索引塊地址,指向下一個節點塊,長度為4個字節。如上圖所示,根節點分別包含(0-B1 500-B2 1000-B3),其中0,500,1000分別表示對應的B1/B2/B3分支節點塊鍵值的最小值,B1/B2/B3指向分支節點塊地址。分支節點塊中所容納的記錄由數據塊大小和索引鍵值長度決定。分支節點還包含下層葉子節點塊的指針。
      • 對於葉子節點來說,包含的索引條目與分支節點一致,默認也是按照升序排列(可指定為降序)。每個索引條目包含2個字段,第一個字段為索引的鍵值,對於單列索引是一個值,復合索引的值組合在一起;第二個字段為鍵值對於行的ROWID,即行在表里的物理地址。
        當用戶創建索引時, Oracle 取得所有被索引列的數據並進行排序,之后將排序后索引值和與此值相對應的 rowid 按照從下到上的順序加載到索引中。例如,以下語句:
        CREATE INDEX employees_last_name ON employees(last_name); 

        Oracle先按照last_name排序,再將排序后的列及相應的rowid按照升序加載到索引中,具體使用索引時,可以快速定位到last_name,在根據rowid去查找對於的數據行記錄。在一個平衡樹索引中,葉子節點塊存儲被索引的數值,葉子節點塊之間以雙向鏈表的形式連接。
        接下來介紹一個索引查詢的流程,從上往下,第一層為根節點,第二層為分支節點,第三層為葉子節點(包含了列值和rowid)。比如我們的條件為where=29,(補充說明如果被索引的列存儲的是字符數據,那么索引值為這些字符數據在當前數據庫字符集中的二進制值)就從跟節點開始查詢,29在0-500中,指向分支節點最左邊第一個分支節點塊(也就是B1),就B1中去找,發現29在0-200中,指向葉子節點的L1,於是在L1中找到29的值和響應的rowid。如果只查找索引列的值,就不用根據rowid去表中查找了,如果還要查找值29這行的其他列的值就得根據rowid去表里查查詢(這個過程叫做回表查詢)。在通過索引進行范圍掃描時會起作用,比如要查找值29-700,如果當查找到值29的時候,不就會再從跟節點開始查找其他的值,而是根據本葉子節點鏈表的指向去查找其他的值。
          
  2. HASH索引
使用hash索引必須使用hash集群,相當於定義了一個hash集群鍵,通過這個集群鍵來告訴oracle來存儲表。存儲數據時,所有相關集群鍵的行都存儲一個數據庫塊中,方便快速定位查找。hash索引是一個等值查詢,通過hash函數確定行的物理位置。
適用場合:

適合:

  • 精確查找非常快(包括= <> 和in),其檢索效率非常高,索引的檢索可以一次定位,不像BTree 索引需要從根節點到枝節點,所以 Hash 索引的查詢效率要遠高於 B-Tree 索引。

不適合:

  • 不適合模糊查詢和范圍查詢(包括like,>,<,between……and等),由於 Hash 索引比較的是進行 Hash 運算之后的 Hash 值,所以它只能用於等值的過濾,不能用於基於范圍的過濾,因為經過相應的Hash 算法處理之后的 Hash 值的大小關系,並不能保證和Hash運算前完全一樣;
  • 不適合排序,數據庫無法利用索引的數據來提升排序性能,同樣是因為Hash值的大小不確定;
  • 復合索引不能利用部分索引字段查詢,Hash 索引在計算 Hash 值的時候是組合索引鍵合並后再一起計算 Hash 值,而不是單獨計算 Hash 值,所以通過組合索引的前面一個或幾個索引鍵進行查詢的時候,Hash 索引也無法被利用。
  • 同樣不適合鍵值較少的列(重復值較多的列);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM