zoukankan      html  css  js  c++  java
  • 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

     

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

  • 相关阅读:
    ElasticSearch安装中遇到的一些问题
    微信扫描二维码下载问题
    nginx截获客户端请求
    Nginx中的一些匹配顺序
    Redis-cli命令最新总结
    RabbitMQ服务安装配置
    Nginx服务状态监控
    使用Sqlserver更新锁防止数据脏读
    PHPStorm IDE 快捷键(MAC)
    MongoDB 安装
  • 原文地址:https://www.cnblogs.com/timlong/p/6107919.html
Copyright © 2011-2022 走看看