http://docs.oracle.com/cd/B28359_01/server.111/b28318/schema.htm#CHDJGADJ
本文內容
- 索引塊格式化
- 索引內部結構
- 索引屬性
- B-tree 結構的優勢
- 參考資料
當創建索引時,Oracle 數據庫自動分配索引段以便在表空間保存索引數據。你可以控制為索引段的空間分配,並按下面方式使用這個已保留的空間:
- 為索引段設置存儲參數,以控制索引段的擴展。
- 為索引段設置 PCTFREE 參數,以控制構成索引段的數據塊中的空閑空間。
索引段的表空間或是擁有者的默認表空間,或是 CREATE INDEX 語句指定的一個表空間。你不必把索引放在與其相關表相同的表空間。因此,你可以通過把索引與其表存儲在不同磁盤的不同表空間來提高查詢性能,因為,Oracle 數據庫可以並行檢索索引和表數據。
B-tree 是一種常見的數據結構,也稱多路搜索樹,並不是二叉樹。B-tree 結構可以顯著減少定位記錄時所經歷的中間過程,從而加快存取速度。B 通常是 Balance 的簡稱。該結構一般用於數據庫的索引,綜合效率較高。B-tree 主要應用在 OLTP 系統(事務方面),而 Bitmap 主要是在 OLAP(分析方面)。
索引塊格式化
索引數據的可用空間是 Oracle 數據庫的塊大小減去塊的開銷、條目開銷、rowid 和每個已索引值的字節長度。
當你創建索引時,Oracle 數據庫讀取和排序已索引的列,並把 rowid 隨每行的索引值一起存儲。之后,Oracle 數據庫從下往上加載索引。例如,下面語句:
CREATE INDEX employees_last_name ON employees(last_name);
Oracle 數據庫在 employees 表 last_name 列上排序。然后,按已排序的順序加載帶有 last_name 和相應 rowid 值的索引。當使用索引時,Oracle 數據庫通過已排序的 last_name 值快速查詢,之后,使用與其相關的 rowid 值來定位行。
索引內部結構
Oracle 數據庫使用 B-trees 存儲索引,來加速數據訪問。若沒有索引,你必須順序掃描數據來查找值。對 n 行,檢索的平均行數為 n/2。隨着數據列的增加,這不能很好地擴展。
一個值的有序列表划分成寬塊范圍(葉子塊),查詢時間減少為 log(n)。這是 Oracle 數據庫索引的基本原則。
圖 1 B-tree 索引的內部結構
圖 2 B-tree 索引詳細內部結構
B-tree 索引的上半部分塊(分支塊)包含索引數據,並指向低一級的索引塊。最低級別的索引塊(葉子塊)包含每個已索引的數據值和用於定位真實行的相應 rowid。葉子塊是雙向鏈接的(雙向鏈表)。包含字符數據的列中索引是基於數據庫字符集的字符二進制值。
對於唯一索引,一個 rowid 對每個數據值存在。對於非唯一索引,rowid 按順序被包含在鍵中,因此,非唯一索引按索引鍵和 rowid 排序。不索引包含 null 的鍵值,除了聚簇索引。兩個行可以包含所有 null 值,這不違反唯一索引。
換個簡單、更直觀的圖,如下圖所示:
圖 3 B-tree 查詢值為 21
說明:
- 每個節點的值個數,最小有兩個,最大有五個,Minimum Degree=2,Maximum Degree=5;
- 若查找值 21,則會經過 10、20、30,最后到 21。
索引屬性
兩類數據塊:
- 分支塊用來檢索
- 葉子塊存儲值
分支塊(Branch Blocks)
分支塊存儲如下內容:
- 最小鍵的前綴,需要在兩個鍵之間做出分支決定
- 指向包含鍵的子塊
若數據塊具有 n 鍵,那么它們就有 n+1 個指針。鍵和指針的數量是由數據塊大小限制的。
葉子塊(Leaf Blocks)
所有葉子塊從 root 到 branch 塊都在同一深度。葉子塊存儲內容如下:
- 每個行的完整鍵值
- 表中每個行的 ROWIDs
所有鍵和 rowid 都被鏈接到它們左邊和右邊的兄弟。它們按鍵和 rowid 排序。
B-tree 結構的優勢
B-tree 結構有如下優勢:
- 樹的所有葉子塊都在相同深度,這樣,在索引中從任何地方檢索任何記錄都大約花費相同的時間。
- B-tree 自動保持平衡。
- All blocks of the B-tree are three-quarters full on the average.
- B-tree 對大范圍查詢提供優秀的檢索性能,包括精確匹配和訪問查詢。
- 插入、更新和刪除操作有效,維護鍵的順序,以便快速檢索。
- B-tree 性能對小表和大表都很好,不會隨着表的增長而降低。
參考資料
Bitmap 索引 vs. B-tree 索引:如何選擇以及何時使用?——1-5
Bitmap 索引 vs. B-tree 索引:如何選擇以及何時使用?——2-5
Bitmap 索引 vs. B-tree 索引:如何選擇以及何時使用?——3-5
Bitmap 索引 vs. B-tree 索引:如何選擇以及何時使用?——4-5
Bitmap 索引 vs. B-tree 索引:如何選擇以及何時使用?——5-5