Oracle位圖索引相關(guān)特點(diǎn)介紹
我們都知道Oracle中通過位圖索引可以在很大的程度上提高查詢的效率,而以下的文章主要要介紹的是Oracle位圖索引的相關(guān)特點(diǎn)及其使用的時(shí)機(jī),如果你想了解的更多的話,以下的文章會(huì)給你提供更多的相關(guān)知識(shí)。
在數(shù)據(jù)庫中(包括Sql Server數(shù)據(jù)庫),對(duì)于這種基數(shù)比較小的列,如果只有有限的幾個(gè)固定值,如上表中的性別、婚姻狀況等等,要為其建立索引的話,采用的就應(yīng)該是位圖索引,而不是B樹索引。
位圖索引為什么可以提高基數(shù)比較小的表的查詢速度呢?這主要是因?yàn)樵趧?chuàng)建位圖索引的時(shí)候,數(shù)據(jù)庫往往會(huì)對(duì)整個(gè)表進(jìn)行掃描,并未索引列的每個(gè)取值建立一個(gè)位圖(位圖索引的名字也由此而來)。在這個(gè)位圖中,為表中的每一行使用一個(gè)位元來表示該行是否包含該位圖的索引列的取值。
位元到行的ROWID的對(duì)應(yīng)關(guān)系通過位圖索引中的應(yīng)收函數(shù)來完成。如此的話,位圖索引就能夠以一種完全不同的內(nèi)部機(jī)制來完成與B樹索引相同的功能。
另外值得一提的是,對(duì)于B樹索引而言,如果在查詢條件語句中采用了AND等操作符號(hào),其查詢的效率會(huì)大打折扣。故在數(shù)據(jù)庫優(yōu)化中,會(huì)建議大家不要使用這些操作符,改用其他操作符代替。不過如果采用位圖索引的話,則沒有這方面的顧慮。如上例所示,假設(shè)用戶需要查找已婚的女性,那么就可以使用如下的語句查詢。
- select t.*, t.rowid
- from userinfo t
- where t.merital=’已婚’ and t.sex=0
這個(gè)查詢引用了一些創(chuàng)建了位圖索引的列時(shí),這些位圖可以很方便的與AND或者OR操作符結(jié)合以找出想要的數(shù)據(jù)。數(shù)據(jù)庫在后臺(tái)處理的時(shí)候,先利用已經(jīng)創(chuàng)建的位圖進(jìn)行邏輯運(yùn)算,然后計(jì)算結(jié)果位圖中1的個(gè)數(shù),就可以查詢到滿足條件的所有記錄。如果查詢到結(jié)果后還需要更改數(shù)據(jù)的話,那么只需要按照結(jié)果位圖中取1的位元對(duì)應(yīng)的ROWID列的值進(jìn)行映射即可。
位圖索引的使用限制
位圖索引雖然在某些情況下能夠起到比B樹索引更好的效果。但是需要注意的是,并不是在任何場(chǎng)合都有效。如上例所示,如果在員工編號(hào)或者員工姓名列中使用的話,反而會(huì)降低數(shù)據(jù)查詢的效率。故其使用仍然受到比較大的限制。
如上面列舉的案例,一般情況下只有在“基數(shù)比較小的列中”和“需要使用與和或的運(yùn)算中”采用位圖索引能夠起到比B樹索引更好的效果。其他情況還是使用B數(shù)索引或者函數(shù)索引為好。
在Oracle數(shù)據(jù)庫中,有B樹索引、位圖索引、函數(shù)索引等等。具體采用哪種索引,還是要根據(jù)不同的情形來對(duì)待。隨著數(shù)據(jù)庫應(yīng)用越來越復(fù)雜,單靠一個(gè)B樹索引已經(jīng)不能夠應(yīng)付了。如列中包含了表達(dá)式或者函數(shù)的話,B樹索引或者位圖索引都不能夠用,只有用函數(shù)索引。
對(duì)于數(shù)據(jù)庫專家來說,索引的創(chuàng)建與管理或許沒有難度,只需要簡(jiǎn)單的幾個(gè)語句即可。比較困難的是,如何根據(jù)實(shí)際情況來選擇合適的索引。