Oracle 索引
在關聯式資料庫中,索引是一種與表有關的資料庫結構,它可以使對應於表的 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 索引@oracle索引技術索引Oracle
- Oracle索引梳理系列(六)- Oracle索引種類之函式索引Oracle索引函式
- 【Oracle索引】-索引基本概念Oracle索引
- Oracle索引——點陣圖索引Oracle索引
- oracle 索引分析及索引重建Oracle索引
- oracle索引操作Oracle索引
- oracle重建索引Oracle索引
- ORACLE索引概述Oracle索引
- Oracle索引原理Oracle索引
- Oracle——03索引Oracle索引
- oracle 索引 管理Oracle索引
- oracle的索引Oracle索引
- Oracle全域性索引和本地索引Oracle索引
- oracle索引詳解 分割槽索引Oracle索引
- oracle 索引使用及索引失效總結Oracle索引
- oracle重建索引(一)Oracle索引
- oracle重建索引(三)Oracle索引
- oracle重建索引(二)Oracle索引
- Oracle OCP(25):索引Oracle索引
- Oracle虛擬索引Oracle索引
- Oracle:全文索引Oracle索引
- oracle index索引原理OracleIndex索引
- ORACLE 索引使用規Oracle索引
- ORACLE索引的管理Oracle索引
- oracle函式索引Oracle函式索引
- oracle 索引壓縮Oracle索引
- (轉)Oracle索引原理Oracle索引
- Oracle索引分割槽Oracle索引
- oracle手冊索引Oracle索引
- oracle索引分類Oracle索引
- Oracle索引失效-likeOracle索引
- Oracle 基礎--索引Oracle索引
- Oracle表與索引的分析及索引重建Oracle索引
- 【索引】Oracle之不可見索引和虛擬索引的比對索引Oracle
- [轉]Oracle分割槽索引--本地索引和全域性索引比較Oracle索引
- Oracle分割槽索引--本地索引和全域性索引比較(轉)Oracle索引
- 【索引】oracle查詢使用索引和不使用索引的比較索引Oracle
- 【TUNE_ORACLE】Oracle索引設計思想(四)三星級索引Oracle索引