1. 程式人生 > >Oracle索引技術研究

Oracle索引技術研究

IT 判斷 pda .html 根節點 數據庫表 key 單獨 外鍵

Oracle索引類型

B樹索引

特定類型索引

確定索引列

主鍵和唯一鍵值列的索引

外鍵索引

其他合適的索引列

B樹索引

B樹索引算法

技術分享圖片

B樹是指B-tree(Balanced Tree),B樹的存在是為了存儲設備而設計的一種多分叉的樹。B樹中

  1. 每個節點至多含有m個子節點
  2. 每個非葉子節點除了根節點之外至少含有⌈m/2⌉個子節點
  3. 根節點至少含有2個子節點否則它是葉子節點
  4. 有k個子節點的非葉子節點包含k-1個鍵值
  5. 所有葉子節點出現在同一層

其中,m稱為該B樹的階,一個3階B樹的節點的排列如同

【指針】鍵值【指針】鍵值【指針】

當遍歷到該節點時順次搜索鍵值,根據大小比較去向該鍵值前的指針指向的子節點還是該節點後的指針指向的。

B+-tree是B-tree的演變

技術分享圖片

區別在於B+樹的每個索引鍵值對應一個子節點,然後葉子節點保持對齊(Balanced)

B樹索引子類型

索引組織表

索引組織表IOT在一個B樹索引結構中存儲表行的所有內容

創建索引組織表

CREATE TABLE … ORGANIZATION

索引組織表是一類特殊的表,它將索引和表的數據存儲在一起。普通表的數據以無序(Heap)的方式存放在數據庫中。而索引組織表按照主鍵進行排序,以二叉樹(B樹)的方式對表的數據進行存儲。索引組織表不需要列ID,而是通過主鍵直接對表的數據進行訪問。

索引組織表的優點

  1. 快速隨機訪問:索引和表存儲在一起,表就是索引自身,oracle只需要索引就可以更新表
  2. 快速範圍掃描:(Range)所有的數據都是按照主鍵進行排序的,所以掃描速度非常容易接近logN
  3. 存儲需求變少:索引和表存儲在一起減少了索引的存儲空間

缺點:

和訪問十分快速的位圖索引一樣,索引組織表的缺點在於更新表中的內容會導致大規模的索引重建,因此索引組織表不是以用於頻繁數據變動的表中。

唯一索引

類似於唯一鍵值約束,唯一索引保證所有插入表中的非空鍵值都是不同的。

創建唯一索引通常與主鍵和唯一約束聯合使用

CREATE UNIQUE INDEX

反向鍵索引

反向鍵索引可以應對大量順序插入索引的IO,能夠均勻的分布索引數據避免相似的鍵值大量的聚集在一起。

創建反向索引

CREATE INDEX cust_ridx1 ON cust(cust_id) REVERSE

不能對位圖索引或索引組織表指定REVERSE語句

反向鍵索引不能是降序類型

反向鍵索引的思路跟傳統索引的思路正好相反,傳統的索引思路對密集型數據區域會增加索引密度以達到提升改高頻訪問地帶搜索效率的目的。但是反向鍵索引思路相反, 為了防止局部過熱(在數據規模過大的情況向有可能高頻熱點數據塞滿了某一塊磁盤的通道導致該局部數據過熱)有大量順序數據插入導致該分區表索引樹極其不平衡的情況下,將建索引的值進行反向操作。

絕對正向有序的數據在連續插入索引是,如果索引的鍵值方案是反向,則絕對正向有序的數據退化為隨機數據(不是絕對反向數據),進而我們保持了所引述的平衡性。否則,索引樹在大量順序插入時極端不平衡導致一側分支的I/O次數大量增加,進而產生前文說明的局部過熱問題。

鍵壓縮索引

減少前導列經常重復的組合索引,使用COMPRESS N創建壓縮索引

CREATE INDEX cust_cidx_1 ON cust(last_name, first_name) COMPRESS 2

不能在位圖索引上創建壓縮索引

降序索引

B樹的算法中默認索引是升序索引,創建降序索引,可以通過DESC關鍵詞反轉降序

譬如,在大數值密集型的數據中降序索引速度很快。

CREATE INDEX cust_didx1

ON CUST(cust_id DESC);

特定索引類型

特定索引類型是專用於特定情況下的索引類型。

位圖索引

位圖索引常用於數據倉庫環境中,適用於相對較低數量不同值的列。

經常使用INSERT/UPDATE/DELETE等操作的數據庫不應使用位圖索引,因為位圖索引會在DML操作期間鎖定多個行

使用關鍵字BITMAP創建位圖索引

CREATE BITMAP index f_sales_fk1

ON f_sales(d_date_id);

位圖索引算法

位圖索引把某一列的所有值枚舉出來後按位的方式(1/0)的方法列後,對所有值為該枚舉量的列標註為1

如test表中有state這樣一列,10行數據如下:

10 20 30 20 10 30 10 30 20 30

那麽會建立三個位圖,如下:

BLOCK1 KEY=10 1 0 0 0 1 0 1 0 0 0
BLOCK2 KEY=20 1 0 0 0 1 0 1 0 0 0
BLOCK3 KEY=30 1 0 0 0 1 0 1 0 0 0

位圖索引統計的速度很快,對行列進行連貫的按位操作是非常迅速地。但是缺點是實體不應該經常改變,因為所有的列與所有枚舉值都有一一對應關系,經常變動的實體集對位圖索引的變動範圍非常大。

基於函數的索引

基於定義的SQL函數或表達式創建的索引

CREATE INDEX cust_fidx1

ON cust(upper(last_name));

分區索引

分區索引在邏輯上是一個索引,但是在不同的段中實現,能夠保證很大的數據庫也有良好的性能。(分區索引是oracle的付費服務)

全局分區索引不映射到基礎表的段,可以為常規表或分區表建立全局分區索引,用B樹實現,使用GLOBAL PARTITION創建全局分區索引

CREATE INDEX f_sales_gidx1 ON f_sales(sales_amt)

GLOBAL PARTITION BY RANGE(sales_amt)P

PARTITION pg1 VALUES LESS THAN (25),

PARTITION pg1 VALUES LESS THAN (50),

PARTITION pg1 VALUES LESS THAN (maxvalue));

本地分區索引必須建立在分區表上,與基礎表遵循相同的分區策略。

分區表與索引

分區表剛開始讓我聯想到磁盤的MBR分區表和GPT分區表。在oracle數據庫中從10支持多種分區表。分區表類似於磁盤分區,為數據添加物理隔斷,分區表之間是物理不相關聯的。這樣做的好處是即便某個分區表的物理存儲損壞也不會影響到其他數據。

分區索引就是在所有每個區上單獨創建索引,它能自動維護,在drop或truncate某個分區時不影響該索引的其他分區索引的使用,也就是索引不會失效,維護起來比較方便,但是在查詢性能稍微有影響。

為分區表創建分區時主鍵必須包含分區列,並且不能創建額外的約束,原因還是物理空間的獨立隔離。

技術分享圖片

技術分享圖片

技術分享圖片

局部索引與全局索引

全局索引,就是索引跨越分區表,在做跨分區查詢優勢快;

局部索引,分區表某個分區的索引,速度比全局快,而且維護更方便 ;

全局索引和局部索引的概念是與分區表有關的。全局索引和局部索引的機制不同,全局索引既可以分區也可以不分區,但是全局索引必須是前綴索引。

優化索引的方法

索引與約束相關

索引與約束相關相當於在索引期間就依照實體集的約束進行有條件的判斷。由於所有索引的依據都是它對應的實體集合,因此實體集合的約束就是索引的約束,索引約束是對無效搜索在索引階段進行提前判斷的有效方法。

創建局部區索引

局部索引一方面節約大量的磁盤IO和存儲空間開支,因為只對實體集合的局部進行索引大幅度減少索引的存儲量;另一方面局部索引是對高頻訪問的實體區域進行有針對性的高密度索引,讓查找的速度盡量推進logN。

基礎表必須是分區表

基礎表構建為分區表一方面是處於保護數據的目的,將不相關的物理設計進行隔離,另一方面保持所有基礎表單數據獨立性映射到物理設計中的分離方法,有利於對數據的操作邏輯規劃與效能分析的對應關系建立

心得與總結

通過本學期的數據庫學習和Oracle數據庫索引技術的研究,我對數據庫技術有了更加全面的認識。

最開始接觸到數據庫是網站方面的需求,往往會選擇較為流行和配置簡單的mysql數據庫進行數據操作。使用到的功能一般也只有基礎的數據庫表操作,完全是當作一個性能增強的excel使用。通過本學期的數據庫學習我對oracle數據庫包括整個數據庫體系有了完整的認識,包括從抽象概念定義和基本的物理定義都有了清晰的了解,懂得了數據庫的數據關系和數據操作的思想。

特別是數據庫索引技術的擴展研究,讓我對大規模數據管理和系統假設的要點有了認識,同時應用到了課程中學到的基本數據庫模型和一些磁盤相關的知識。鞏固了基礎的Balance樹算法和構造方法,同時對很多高級索引技術的思想有了認識。

索引技術可以理解為對數據查詢到一個預先準備。通常,速度越快的索引技術對於數據實體的靜態性要求越高,而這些索引建立時所對應的抽象層次相對較高,需要一個比較堅實的數據基礎,否則頻繁更新實體往往伴隨著大規模的表重建操作。

參考文獻

《Oracle索引技術》 (美)Darl Kuhn

圖源:http://blog.csdn.net/v_JULY_v/article/details/6530142/

B樹的定義:https://en.wikipedia.org/wiki/B-tree

位圖索引:https://www.cnblogs.com/LBSer/p/3322630.html

分區索引:

http://ctwen.iteye.com/blog/2250320

http://blog.itpub.net/35489/viewspace-616711/

索引組織表:http://blog.csdn.net/ljean/article/details/51360398

反向鍵索引:http://blog.csdn.net/zq9017197/article/details/7321604

Oracle索引技術研究