B樹索引和點陣圖索引的結構介紹
一 前言:? 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 點陣圖索引(Bitmap Index)——從B*樹索引到點陣圖索引索引Index
- B樹索引的內部結構索引
- 【索引】Bitmap點陣圖索引與普通的B-Tree索引鎖的比較索引
- Oracle索引——點陣圖索引Oracle索引
- 點陣圖索引(Bitmap Index)——索引共用索引Index
- 理解索引:HBase介紹和架構索引架構
- 點陣圖索引.sql索引SQL
- B-Tree索引與Bitmap點陣圖索引的鎖代價比較研究索引
- 【基礎知識】索引--點陣圖索引索引
- 點陣圖索引(Bitmap Index)——點陣圖索引與資料DML鎖定索引Index
- Oracle-點陣圖索引Oracle索引
- Oracle中的B樹索引Oracle索引
- 【Bitmap Index】B-Tree索引與Bitmap點陣圖索引的鎖代價比較研究Index索引
- 【點陣圖索引】在點陣圖索引列上進行更新操作的鎖代價研究索引
- 點陣圖索引的工作原理 - Richard索引
- Mysql索引資料結構為什麼是B+樹?MySql索引資料結構
- Mysql InnoDB B+樹索引和雜湊索引的區別? MongoDB 為什麼使用B-樹?MySql索引MongoDB
- 淺談MySQL的B樹索引與索引優化MySql索引優化
- oracle 點陣圖索引(bitmap index)Oracle索引Index
- 點陣圖索引:原理(BitMap index)索引Index
- 點陣圖索引(bitmap-index)索引Index
- oracle的B-tree索引結構分析Oracle索引
- 轉儲B*Tree索引的分枝結構索引
- 跳槽必看MySQL索引:B+樹原理揭秘與索引優缺點分析MySql索引
- MySQL單列索引和組合索引的區別介紹MySql索引
- 主鍵為聯合主鍵時,索引B+樹結構索引
- MySQL為什麼採用B+樹作為索引結構?MySql索引
- Oracle如何建立B樹索引Oracle索引
- MySQL索引介紹MySql索引
- Sql索引介紹SQL索引
- Python點陣圖索引學習Python索引
- bitmap index點陣圖索引系列(一)Index索引
- 雜湊,二叉樹,紅黑樹,B樹,B+樹,LSM樹等資料結構做索引比較二叉樹資料結構索引
- 【Mysql】InnoDB 中的 B+ 樹索引MySql索引
- 搞懂MySQL InnoDB B+樹索引MySql索引
- Oracle如何實現B樹索引Oracle索引
- 平衡樹索引(b-tree index)索引Index
- [轉]:bitmap索引和B*tree索引分析索引