码迷,mamicode.com
首页 > 数据库 > 详细

Oracle - 位图索引的适用条件

时间:2016-11-28 08:47:37      阅读:329      评论:0      收藏:0      [点我收藏+]

标签:静态   个数   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 - 位图索引的适用条件

标签:静态   个数   lsp   rowid   数据库   使用   cell   原因   oracle   

原文地址:http://www.cnblogs.com/longneo/p/6107919.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!