Oracle - 位圖索引的適用條件


位圖索引的適用條件

位圖索引適合只有幾個固定值的列,如性別、婚姻狀況、行政區等等,而身份證號這種類型不適合用位圖索引。

位圖索引適合靜態數據,而不適合索引頻繁更新的列。

 

舉個例子,有這樣一個字段busy,記錄各個機器的繁忙與否,當機器忙碌時,busy為1,當機器不忙碌時,busy為0。

這個時候有人會說使用位圖索引,因為busy只有兩個值。好, 我們使用位圖索引索引busy字段!假設用戶A使用update更新某個機器的busy值,比如update table set table.busy=1 where rowid=100;,但還沒有commit,而用戶B也使用update更新另一個機器的busy值,update table set table.busy=1 where rowid=12; 這個時候用戶B怎么也更新不了,需要等待用戶A commit。

原因:用戶A更新了某個機器的busy值為1,會導致所有busy為1的機器的位圖向量發生改變,因此數據庫會將busy=1的所有行鎖定,只有commit之后才解鎖。

 

問題: 為什么更新了某個機器的busy值為1會導致所有busy為1的機器的位圖向量發生改變,因此數據庫會將busy=1的所有行鎖定

答案請看位圖索引的存儲結構。

位圖的存儲,位圖中位的個數和表中的記錄數項目,

比如下面婚姻狀況表

姓名(Name) 性別(Gender) 婚姻狀況(Marital)
張三 已婚
李四 已婚
王五 未婚
趙六 離婚
孫七 未婚

 

表中有5行記錄,所以創建的記錄會有5位

性別列-男的位圖: 10100

性別列-女的位圖: 01011

 

已婚列的位圖: 11000

未婚列的位圖: 11000

離婚列的位圖: 11000

 

所以現在知道了吧, 當要更新位圖索引時,就要更新這個位圖,那么將會鎖定整個位圖或者要更新的這個位所在的塊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM