跟大家講解下有關ORACLE 索引,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說ORACLE 索引,小編也收集到了有關ORACLE 索引的相關資料,希望大家看到了會喜歡。
今天整理ORACLE索引,ORACLE索引有很多類型,包括有: B樹索引(默認類型) 位圖索引 HASH索引 索引組織表索引 反轉鍵(reverse key)索引 基于函數的索引 分區索引(本地和全局索引) 位圖連接索引 今天主要針對oracle最常見、應用最廣泛 B樹索引(默認類型)、位圖
今天整理ORACLE索引,ORACLE索引有很多類型,包括有:
B樹索引(默認類型)
位圖索引HASH索引索引組織表索引反轉鍵(reverse key)索引基于函數的索引分區索引(本地和全局索引)位圖連接索引
今天主要針對oracle最常見、應用最廣泛B樹索引(默認類型)、位圖索引進行整理,直接進入正文:
首先先了解創建索引的語法:
CREATE UNIUQE | BITMAP INDEX . ON . ( | ASC | DESC, | ASC | DESC,...) TABLESPACE STORAGE LOGGING | NOLOGGING COMPUTE STATISTICS NOCOMPRESS | COMPRESS NOSORT | REVERSE PARTITION | GLOBAL PARTITION
UNIUQE:創建唯一索引,創建索引的列的值必須不相同的,是唯一BITMAP:創建位圖索引,不指定就是創建B-TREE(oracle默認)索引.:指定索引名稱.:指定索引所應用的表名:為哪個列創建索引TABLESPACE:指定表所在的表空間STORAGE:可進一步設置表空間參數LOGGING | NOLOGGING:索引是否重做日志COMPUTE STATISTICS:創建新索引時收集統計信息NOCOMPRESS | COMPRESS:是否使用索引鍵壓縮(鍵壓縮可以刪除鍵中出現的重復值,減少存儲空間使用同時效率會降低)NOSORT:表示與表中相同的順序創建索引,REVERSE表示相反順序存儲索引值PARTITION | GLOBAL PARTITION:可以對分區表或未分區表上創建的索引進行分區
例1:為test2表創建默認B-tree索引
CREATE INDEX t_name_index on test2 (name) --其他項默認
--創建B-TREE索引成功!就這么簡單,那么什么是B-tree所以呢?往下看
什么是B-tree索引?B-tree索引時最常見的一種類型,也是oracle默認類型。B樹索引指的是一種平衡樹,使用平衡算法來管理索引的。B樹索引從結構上看是一個倒立的樹狀結構,它有兩種類型的數據塊:分支塊和葉塊。分支塊的作用是根據條件查詢定位其他分支塊和葉塊的位置。葉塊是用于存儲索引的列值和對應數據行的物理地址,該物理地址用rowid來表示,rowid是一個指針,用它來指向數據行的物理地址,這是oracle數據庫訪問數據行的最快方法。索引中只保存索引的列值和rowid,才是它的規模比表要小的多,所以對索引查詢的速度要遠高于對表的檢索速度。B-tree索引檢索原理舉例說明:查詢ID為2199的記錄,那么執行 SELECT * FROM TEST WHERE ID=2199;如果沒有索引那么要查詢呢2199的記錄就需要對全表掃描,現在對ID列上建立B-tree索引,使用索引查詢的原理步驟為:1、讀取最上層的分支塊數據,得知id為2199記錄的索引在第二層分支塊B3鎖定位的范圍內。2、讀取第二層分支塊B3中數據,得知ID為2199記錄的索引列在第二層分支塊B3下面的葉塊B31中存儲3、讀取葉塊中B31數據,獲取id為2199的記錄的rowid,然后得到rowid得到該記錄。可見索引檢索數據至讀取了3個數據塊,要遠遠低于全表讀取數據的數量。大大降低了I/0操作數據,從而提高了查詢效率。如果查詢是不等查詢,則從第三層開始不必重新沿著向最上層分支塊查找,直接沿著雙向鏈表進行查詢即可,如下圖代碼所示:SELECT * FROM TEST WHERE ID BETWEEN '2199' AND '2999';此時查詢該記錄的步驟為:1、讀取最上層的分支塊數據,得知id為2199的記錄的索引列值在第二層分支塊B3所在的范圍內。2、讀取第二層B3中的數據,得知ID為2199的記錄索引列值在第二層分支塊下面葉塊B31中存儲。3、讀取葉塊B31中數據,獲得ID為2199的rowid, 然后根據rowid得到該記錄。4、沿著葉塊雙向鏈表結構向后依次獲取2999的記錄rowid,然后根據rowid得到相應記錄。對于索引來說,B-tree索引結構思一個十分有效的數據結構,其層次通常很短,一般不會超過三層,在一個千萬數據級的表中查詢一條記錄,一般也只需讀取3個數據塊。當一條新數據插入表中,新的信息同時也被插入到葉塊中;當一個葉塊被寫滿后,被插入新的行信息葉塊就會被分割為兩個葉塊,新的葉塊定位信息就會被放入上層分支塊中;如果分支塊也被寫滿,那么它也會自動分割為兩個分支塊,新的分支塊地位信息同時放入到上層分支塊中,以此類推直到全部信息寫入各個級別的分支塊。在此過程中平衡算法會自動調整各個分支塊所能定位的下級分支塊和葉塊的數量以及葉塊中保存索引列值數量,以使各分支盡量達到平衡。雖然B-tree索引應用最為廣泛,但也不適用于所有情況,適用B樹索引的場合有:1、表中存儲的數據庫很多2、列中存儲的不同數據值很多3、查詢的數據量不超過全表的5%,否則應使用全表掃描
用于查看索引信息user_indexes:select index_name,blevel+1,table_name from user_indexes; --blevel表示該索引有幾個分支塊,+1表示包含葉塊數量
例子2:為test2表創建位圖索引
CREATE BITMAP INDEX t_name_index on test2 (name) --test2表創建位圖索引雖然B-tree索引應用很廣,但在一個列有多很多重復值時,B-TREE索引的葉塊就會存儲很多重復的數據,反而會影響數據查詢效率。對于一個列中重復值很多時,采用位圖索引進行檢索查詢效率會更高。ORACLE創建位圖索引時,會為索引創建一個位圖,該位圖由二進制數組成。0表示該列無值,1表示該列有值。直接上例子:SELECT s_id,s_name,s_political,s_language from student;sid s_name s_political s_language 0807020225 張三 共青團員 日語0807020226 李四 共青團員 英語0807020227 王五 群眾 英語0807020228 趙六 共青團員 英語0807020229 孫琦 共青團員 日語0807020230 王八 預備黨員 英語0807070130 王八1 預備黨員 英語0807070201 王八2 黨員 英語如以s_political、s_language為條件查詢,那么位圖索引二進制表示為:共青團員:11011000群眾: 00100000預備黨員:00000110黨員: 00000001日語:10001000英語:01110111--以上是位圖索引所表現的搜索方式,0表示該列無值,1表示該列有值。假設要查詢政治面貌是‘共青團員’語種是‘英語’的學生學號、姓名,可執行下面的語句:SELECT S_ID,S_NAME,FROM STUDENT WHERE s_political='共青團員' and s_language='英語'共青團員:11011000英語: 01110111共青團員和英語匹配為1的。那么記錄為2,4對于表列中重復數據很多時使用位圖索引可以查詢提高效率。當對表總進行增刪改時會重新組織索引項,每個位圖索引項都包含了表中大量數據行的rowid,因此對于頻繁使用增刪改操作表不適用于使用位圖索引。使用位圖所有的場合有:1、表中有大量數據存在2、表中列有重復數值不少3、列用于布爾運行(or,and,not);
查看索引信息
select * from user_indexes
有時創建了索引,但并沒有比沒索引查詢速度高,這是因為索引中也存在一些自身的限制:
查看網絡連接:http://blog.chinaunix.net/uid-24612962-id-3243307.html
來源:php中文網