Oracle數(shù)據(jù)庫中怎樣選擇合適索引類型
索引的相關(guān)作用就好比字典的目錄。根據(jù)字典的目錄,我們就可以快速的找到我們需要的相關(guān)條目。數(shù)據(jù)庫的作用也是。通過Oracle數(shù)據(jù)庫的索引,我們就可以可以迅速的來定位記錄的位置,而不必去定位整個(gè)表。
雖然說,在表中是否創(chuàng)建索引,不會(huì)影響到Oracle數(shù)據(jù)庫的使用,也不會(huì)影響Oracle數(shù)據(jù)庫語句的使用。這就好像即使字典沒有目錄的話,用戶仍然可以使用它一樣??墒?,若字典沒有目錄,那么可想而知,用戶要查某個(gè)條目的話,其不得不翻遍整本字典。數(shù)據(jù)庫也是如此。
若沒有建立相關(guān)索引的話,則數(shù)據(jù)庫在查詢記錄的時(shí)候,不得不去查詢整個(gè)表。當(dāng)表中的記錄比較多的時(shí)候,其查詢效率就會(huì)很低。所以,合適的索引,是提高數(shù)據(jù)庫運(yùn)行效率的一個(gè)很好的工具。
不過,并不是說表上的索引越多越好。過之而不及。故在數(shù)據(jù)庫設(shè)計(jì)過程中,還是需要為表選擇一些合適的索引。寧缺勿濫,這是建立索引時(shí)的一個(gè)遵循標(biāo)準(zhǔn)。在理論上,雖然一個(gè)表可以設(shè)置無限的索引。但是,數(shù)據(jù)庫管理員需要知道,表中的索引越多,維護(hù)索引所需要的開銷也就越大。
每當(dāng)數(shù)據(jù)表中記錄有增加、刪除、更新變化的時(shí)候,數(shù)據(jù)庫系統(tǒng)都需要對(duì)所有索引進(jìn)行更新。故數(shù)據(jù)庫表中的索引絕對(duì)不是多多益善。具體來說,在索引建立上,筆者對(duì)大家有如下建議。在基數(shù)小的字段上要善于使用位圖索引。
基數(shù)是位圖索引中的一個(gè)基本的定義,它是指Oracle數(shù)據(jù)庫表中某個(gè)字段內(nèi)容中不重復(fù)的數(shù)值。如在員工信息表中的性別字段,一般就只有男跟女兩個(gè)值,所以,其基數(shù)為2;婚姻狀況字段的話,則其只有已婚、未婚、離婚三種狀態(tài),其基數(shù)就為3;民族一覽內(nèi)也是只有有限的幾個(gè)值。
對(duì)于要查詢基數(shù)小的字段,如現(xiàn)在用戶想查找所有婚姻狀況為“已婚”的“女性”時(shí),利用位圖索引可以提高查詢的效率。這主要是因?yàn)闃?biāo)準(zhǔn)索引是通過在索引中保存排序過的索引列以及對(duì)應(yīng)的ROWID來實(shí)現(xiàn)的。若我們?cè)诨鶖?shù)小的列上建立標(biāo)準(zhǔn)索引的話,則其會(huì)返回大量的記錄。
而當(dāng)我們?cè)趧?chuàng)建位圖索引的時(shí)候,在Oracle會(huì)對(duì)整個(gè)表進(jìn)行掃描,并且會(huì)為索引列的每個(gè)取值建立一個(gè)位圖。若內(nèi)容相同,則在位圖上會(huì)以一個(gè)相同的數(shù)字表示。此時(shí),若這個(gè)字段的基數(shù)比較小的話,則若需要實(shí)現(xiàn)對(duì)整個(gè)字段的查詢的話,效率就會(huì)非常的高。因?yàn)榇藭r(shí),數(shù)據(jù)庫只要位圖中數(shù)字相同的內(nèi)容找出來即可。
除了在數(shù)據(jù)表某列基數(shù)比較小的情況下,采用位圖索引外,我們往往在一些特殊的情況下,也會(huì)建議采用位圖索引。最常見的情況是,在Where限制條件中,若我們多次采用AND或者OR條件時(shí),也建議采用位圖索引。因?yàn)楫?dāng)一個(gè)查詢飲用了一些部署了位圖索引的列的時(shí)候,這些位圖可以很方便的與AND或者Or 運(yùn)算符操作結(jié)合以快速的找出用戶所需要的記錄。
但是,這里要注意,不是在條件語句中包含運(yùn)算符的時(shí)候,采用位圖索引都能夠提供比較高的效率。一般來說,只有AND 或者OR運(yùn)算符的時(shí)候,位圖索引才會(huì)比較具有優(yōu)勢(shì)。若此時(shí)用戶采用大于號(hào)或者不等于號(hào)作為條件語句中的限制條件的時(shí)候,則往往采用標(biāo)準(zhǔn)索引具有更大的優(yōu)勢(shì)。
所以,筆者在Oracle數(shù)據(jù)庫設(shè)置中,一般只有在三種情況下才采用位圖索引。一是列的基數(shù)比較小,而有可能需要根據(jù)這些字段的內(nèi)容查找相關(guān)的記錄;二是在條件語句中,用到了AND或者OR運(yùn)算符的時(shí)候。除了這兩種情況外,最好能夠采用其他適合的索引。
第三種情況是,需要用到NULL作為查詢的限制條件。因?yàn)闃?biāo)準(zhǔn)查詢一般情況下,會(huì)忽略所有的NULL值列。也就是說,若需要查詢“所有沒有身份證號(hào)碼”的員工的信息的時(shí)候,標(biāo)準(zhǔn)索引并不能夠起到加速查詢速度的作用。此時(shí),就需要采用位圖索引。因?yàn)槲粓D索引會(huì)記錄相關(guān)的NULL值列信息。
【編輯推薦】