B樹索引和點陣圖索引的結構介紹

wzq609發表於2014-06-02

一  前言:? ROWID:包含鍵值的行的行ID,(查詢塊的最快方法,類似於門牌號)? 因為所有行屬於同一個段,所以要使用受限的ROWID 指向錶行

索引是資料庫為了提高查詢效率提供的一種冗餘結構,保守計算資料庫50%以上的調優可以透過調整索引來進行最佳化;

引用國內一位資深的ORACLE專家的話:"我其實只懂點(挨踢)知識,IT裡面其實只懂點甲骨文,甲骨文裡面其實只懂點資料庫,資料庫裡面其實只懂點SQL,SQL裡面其實只懂點索引"——"你才是真正的專家!"

根據個人的淺薄的經驗,作為DBA的日常運維會越來越少,從資料庫的每個版本的更新來看,資料庫系統已經趨向越來越智慧話,DBA能幹的活也越來越少了,如果一個DBA只能做做日常的表空間擴容、資料庫的備份恢復、啟停、系統的更新,那麼將是很危險的一件事。而調優自古以來就是一門很高深的學問,如果能把這個做好了,那麼DBA能夠創造的價值和在公司的作用中,將越來越顯著;

說了這麼多,應該引入主題了,如果要做好調優,先從索引入手吧。

後續的章節中將陸續更新索引的一些知識,第一章從索引的類別開始吧;

 

二  索引在結構上的類別可劃分如下:B樹索引、點陣圖索引、雜湊索引、反轉索引等

 

三  索引的介紹:

1、B樹索引(BTREE

B數索引是我們日常工作最最常用的索引,大家平時在工作中說的"索引"預設都是B數索引;

索引其實很簡單,也很容易理解,用一本書的目錄來形容最為貼切了,B樹索引的結構跟圖書館的目錄也很像

B樹索引的結構:

索引的頂層為根,它包括指向索引中下一層次的條目。下一層次為分支塊,它又指向位於索引中下一層索引中下一層次的塊,最底層的是葉節點,它包含指向錶行的索引條目。葉塊是雙向關聯的,這邊與按鍵值升序或降序掃描索引;

 

索引葉條目的格式

一個索引條目包含以下元件:

? 條目頭:儲存列數和鎖定資訊

? 鍵列長度/值對:用於定義鍵中的列大小,後面跟隨列值(此類長度/值對的數目就是索引中的最大列數)。

 

索引葉條目的特性

在非分割槽表的B 樹索引中:

? 當多個行具有相同的鍵值時,如果不壓縮索引,鍵值會出現重複

? 當某行包含的所有鍵列為NULL 時,該行沒有對應的索引條目。因此,當WHERE 子句指定了NULL 時,將始終執行全表掃描

 

對索引執行DML 操作的效果

對錶執行DML 操作時,Oracle 伺服器會維護所有索引。下面說明對索引執行DML 命令產生的效果:

? 執行插入操作導致在相應塊中插入索引條目。

? 刪除一行只導致對索引條目進行邏輯刪除。已刪除行所佔用的空間不可供後面新的葉條目使用。

? 更新鍵列導致對索引進行邏輯刪除和插入。PCTFREE 設定對索引沒有影響,但建立時除外。即使索引塊的空間少於PCTFREE 指定的空間,也可以向索引塊新增新條目。

該圖更能體現索引的結構

 

2、點陣圖索引

點陣圖索引(bitmap index)是從Oracle7.3 版本開始引入的。目前Oracle 企業版和個人版都支援點陣圖索引,但標準版不支援。

點陣圖索引在平時的OLTP系統中比較少見,但是在OLAP系統中就會經常見到,號稱資料倉儲調優的三個利器之一;

 

 

 

點陣圖索引(透過在以下特定情況下,點陣圖索引比B 樹索引更有優勢:

? 表具有數百萬行且鍵列的基數較低時(也就是列的不同值極少時)。例如,對於護照記錄表中的性別和婚姻狀況列,點陣圖索引可能比B 樹索引更可取。

? 經常使用包含OR 運算子的多個WHERE 條件組合進行查詢時

? 鍵列上的活動為只讀活動或少量更新活動時(OLAP系統的特點)

 

點陣圖索引的結構

點陣圖索引也可以按B 樹形式進行組織,但是,葉節點會儲存每個鍵值的點陣圖,而不是行ID 列表。點陣圖中每一位與一個可能的行ID 對應,如果設定了該位,則表示具有對應行ID 的行包含鍵值。

如圖所示,點陣圖索引的葉節點包含:

? 條目頭,其中包含列數和鎖定資訊

? 由每個鍵列的長度/值對組成的鍵值(在幻燈片的示例中,關鍵字只由一列組成;第一個條目的鍵值為Blue)

? 開始ROWID,在本示例中它指定塊號10、行號0 和檔案號3

? 結束ROWID,在本示例中它指定塊號12、行號8 和檔案號3

? 由位字串組成的點陣圖段(如果對應行包含鍵值,則會設定位;如果對應行不包含鍵值,則不會設定位。Oracle 伺服器使用已獲專利的壓縮技術儲存點陣圖段。)開始ROWID 是點陣圖中的點陣圖段指向的第一行的行ID,也就是說,點陣圖的第一位對應於該行ID,點陣圖的第二位對應於塊中的下一行。結束ROWID 是一個指標,它指向由點陣圖段覆蓋的表中的最後一行。點陣圖索引使用受限的行ID。

 

使用點陣圖索引

B 樹用於定位葉節點,這些節點包含指定鍵值的點陣圖段。開始ROWID 和點陣圖段用於定位包含鍵值的行。

對錶中的鍵列進行更改後,也必須修改點陣圖。這會導致相關的點陣圖段被鎖定。由於鎖是在整個點陣圖段上獲得的,因此,在第一個事務處理結束之前,其它事務處理不能更新點陣圖覆蓋的行。

 

 

文件的篇幅有限,先介紹最常見的B樹索引和點陣圖索引,這只是入門的第一步,後續將會陸續更新,多謝各位的關注。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

本文作者:JOHN

ORACLE技術部落格:ORACLE 獵人筆記               資料庫技術群:367875324 (請備註ORACLE管理 )  

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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

相關文章