標籤:靜態 個數 lsp rowid 資料庫 使用 cell 原因 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
所以現在知道了吧, 當要更新位元影像索引時,就要更新這個位元影像,那麼將會鎖定整個位元影像或者要更新的這個位所在的塊。
Oracle - 位元影像索引的適用條件