• 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

    所以现在知道了吧, 当要更新位图索引时,就要更新这个位图,那么将会锁定整个位图或者要更新的这个位所在的块。

  • 相关阅读:
    python反射
    numpy笔记
    leetcode43
    leetcode-42
    The Github Flow
    leetcode-37
    leetcode-41
    leetcode-40
    TCP扫盲2
    字节码分析与操作
  • 原文地址:https://www.cnblogs.com/xzpp/p/3389447.html
Copyright © 2020-2023  润新知