Oracle 索引

nana1123發表於2022-04-26

  在關聯式資料庫中,索引是一種與表有關的資料庫結構,它可以使對應於表的 SQL 語句執行得更快。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。 

對於資料庫來說,索引是一個必選項,但對於現在的各種大型資料庫來說,索引可以大大提高資料庫的效能,以至於它變成了資料庫不可缺少的一部分。

 

索引分類:

邏輯分類

single column or concatenated      對一列或多列建所引

unique or nonunique     唯一的和非唯一的所引,也就是對某一列或幾列的鍵值( key )是否是唯一的。

Function-based     基於某些函式索引,當執行某些函式時需要對其進行計算,可以將某些函式的計算結果事先儲存並加以索引,提高效率。 

Doman     索引資料庫以外的資料,使用相對較少

 

物理分類

B-Tree  normal or reverse key   B-Tree 索引也是我們傳統上常見所理解的索引,它又可以分為正常所引和倒序索引。

Bitmap   : 點陣圖所引,後面會細講

 

  

B-Tree 索引                                                                                 

 

  B-Tree index  也是我們傳統上常見所理解的索引。 B-tree  balance tree )即平衡樹,左右兩個分支相對平衡。

B-Tree index

Root 為根節點, branch  為分支節點, leaf  到最下面一層稱為葉子節點。每個節點表示一層,當查詢某一資料時先讀根節點,再讀支節點,最後找到葉子節點。葉子節點會存放 index entry  (索引入口),每個索引入口對應一條記錄。

Index entry  的組成部分:

Indexentry entry  header     存放一些控制資訊。

Key column length      某一 key 的長度

Key column value       某一個 key  的值

ROWID     指標,具體指向於某一個資料

 

建立索引:

 conn as1   dex (id ,sex (),name ( 
     i  ..
      dex (i,,        SQL    
          dex_idx1   ,object_type DEX

  索引分離於表,作為一個單獨的個體存在,除了可以根據單個欄位建立索引,也可以根據多列建立索引。 Oracle 要求建立索引最多不可超過 32 列。

SQL> create index dex_index2 on dex(sex,name);Index created.
SQL>  select object_name,object_type from user_objects;OBJECT_NAME                           OBJECT_TYPE--------------------------------------------------------------------------------DEX                                       TABLEDEX_IDX1                                 INDEXDEX_INDEX2                               INDEX

 

這裡需要理解:

  編寫一本書,只有章節頁面定好之後再設定目錄;資料庫索引也是一樣,只有先插入好資料,再建立索引。那麼我們後續對資料庫的內容進行插入、刪除,索引也需要隨之變化。但索引的修改是由 oracle 自動完成的。

上面這張圖能更加清晰的描述索引的結構。

跟節點記錄 0 50 條資料的位置,分支節點進行拆分記錄 0 10.......42 50 ,葉子節點記錄每第資料的長度和值,並由指標指向具體的資料。

最後一層的葉子節是雙向連結,它們是被有序的連結起來,這樣才能快速鎖定一個資料範圍。

如:

SQL> select * from dex where id>23 and id<32;
        ID SE NAME---------- -- --------------------
        24 M  chongshi        25 M  chongshi        26 M  chongshi        27 M  chongshi        28 M  chongshi        29 M  chongshi        30 M  chongshi        31 M  chongshi8 rows selected.

  如上面查詢的列子,透過索引的方式先找到第 23 條資料,再找到第 32 條資料,這樣就能快速的鎖定一個查詢的範圍,如果每條資料都要從根節點開始查詢的話,那麼效率就會非常低下。

 

 

點陣圖索引                                                                        

 

  點陣圖索引主要針對大量相同值的列而建立。拿全國居民登入一第表來說,假設有四個欄位:姓名、性別、年齡、和身份證號,年齡和性別兩個欄位會產生許多相同的值,性別只有男女兩種值,年齡,1 120 (假設最大年齡 120 歲)個值。那麼不管一張表有幾億條記錄,但根據性別欄位來區分的話,只有兩種取值(男、女)。那麼點陣圖索引就是根據欄位的這個特性所建立的一種索引。

Bitmap Index

  從上圖,我們可以看出,一個葉子節點(用不同顏色標識)代表一個key , start rowid  和  end rowid 規定這種型別的檢索範圍,一個葉子節點標記一個唯一的 bitmap 值。因為一個數值型別對應一個節點,當時行查詢時,點陣圖索引透過不同點陣圖取值直接的位運算(與或),來獲取到結果集合向量(計算出的結果)。

 

舉例講解:

假設存在資料表T,有兩個資料列A和B,取值如下 ,我們看到 A和B列中存在相同的資料。

對兩個資料列A、B分別建立點陣圖索引:idx_t_bita和idx_t_bitb。兩個索引對應的儲存邏輯結構如下:

Idx_t_bita索引結構,對應的是葉子節點:

Idx_t_bitb索引結構,對應的是葉子節點:

 

對查詢“ select * from t where b=1 and (a=’L’ or a=’M’)

分析 :點陣圖索引使用方面,和B*索引有很大的不同。B*索引的使用,通常是從根節點開始,經過不斷的分支節點比較到最近的符合條件葉子節點。透過葉子節點上的不斷Scan操作,“掃描”出結果集合rowid。

而點陣圖索引的工作方式截然不同。透過不同點陣圖取值直接的位運算(與或),來獲取到結果集合向量(計算出的結果)。

針對例項 SQL ,可以拆分成如下的操作:

1、a=’L’ or a=’M’

a=L:向量:1010

a=M:向量:0001

or操作的結果,就是兩個向量的或操作:結果為1011。

 

2、結合b=1的向量

中間結果向量:1011

B=1:向量:1001

and操作的結果,1001。翻譯過來就是第一和第四行是查詢結果。

 

3、獲取到結果rowid

目前知道了起始rowid和終止rowid,以及第一行和第四行為操作結果。可以透過試算的方法獲取到結果集合rowid。

 

點陣圖索引的特點

1.Bitmap 索引的儲存空間節省 

2.Bitmap 索引建立的速度

3.Bitmap 索引允許鍵值為空 

4.Bitmap 索引對錶記錄的高效訪問

 

建立點陣圖索引:


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

相關文章