Oracle 之索引,妙不可言(四)——位图索引

位图索引​​​

  • CREATE BITMAP INDEX index_name ON table_name(column_list);
  • 卓越性能展现
    • 统计条数奋勇夺冠
      • count() 性能
        • 在非空列有BTREE索引的情况下,一般用到该索引性能远高于全表扫描,性能最高的是列上有位图索引,且位图索引列可以存储空值。
    • 即席查询一骑绝尘
      • 即席查询用位图索引性能更好
  • 缺陷随之出现
    • 遭遇更新苦不堪言
      • 锁困扰(Lock Contention)指的是多个会话尝试获取同一资源的时候,由于资源被占用而造成的性能问题。这种问题通常出现在并发高、事务频繁、锁粒度小的情况下。
      • 锁困扰
        • 表级锁:多个会话尝试同时修改同一张表。当修改数据时,会话会获取该表的写锁,其他会话如果也需要对该表进行写操作,就会出现锁等待。该情况可以通过减少事务的并发度、减少表的冲突等方式来解决。
        • 行级锁:多个会话尝试同时修改同一行数据。当修改数据时,会话会获取该行的行级锁,其他会话如果也需要对该行进行修改,就会出现锁等待。该情况可以通过减少事务的并发度、减小锁的粒度等方式来解决。
        • 索引锁:多个会话尝试同时修改同一索引。当修改数据时,Oracle 会获取该索引的所有行的行级锁,其他会话如果也需要对该索引进行修改,就会出现锁等待。该情况可以通过调整 SQL 语句、减少索引的冲突等方式来解决。
      • 避免锁困扰问题解决方法
        • 尽量减少事务的并发度,避免多个事务同时对同一资源进行操作。
        • 设计合理的锁定策略,提高锁的粒度,减少锁冲突的概率。
        • 分析 SQL 语句,优化 SQL 语句的执行计划,减少索引冲突等。
        • 尽量使用更高级的锁机制,如行级锁等,以减少锁的冲突概率。
        • 使用数据库级别的锁机制,如 Oracle 的排他行级锁(Exclusive Row-Level Lock),来避免锁冲突和死锁问题。
    • 重复度低一败涂地
      • COUNT(*) 性能在位图索引列的重复度低时,不适用位图索引
      • 当位图索引列的重复度低时,使用位图索引会导致索引占用内存很大,而且查询时需要在位图索引上进行位运算,计算结果较慢,因此效率较低。而COUNT(*)查询通常是对整个表或者大批量数据进行统计,此时应该使用B-tree索引或者其他适合的索引类型来提高查询效率。
  • 原理
    • 使用二进制位图数据结构来存储索引信息。
    • 每个索引键值映射为一个位图,位图中的每个二进制位表示一条记录是否存在该键值所对应的列。
    • 是一种专门用于低基数列(即一列中有很少不同的值)的索引类型。 如果一列中有很多重复的值,它的建立可以提高查询的速度和减少存储空间的使用。
  • 位图的适用场景
    • 位图索引列大量重复
    • 该表极少更新
  • 结构
    • BTREE索引存储的是列值,而位图索引存储的是比特位值
  • 优点
    • 可以提高查询速度。
    • 使用的存储空间比 B-树索引小。
  • 缺点
    • 如果列中有很多不同的值,则不适合使用中位数索引。
    • 在更新数据时,中位数索引的维护比 B-树索引更困难和更昂贵。
  • 案例
    • 假设有一个名为“性别”的列,只有两个值“男”和“女”,如果对该列创建中位图索引,那么将使用一个两位的二进制位图来表示索引。其中,第一位表示“男”,第二位表示“女”。如果某条记录的“性别”是“男”,那么会将第一位的二进制位置为1,第二位的二进制位置为0。如果某条记录的“性别”是“女”,那么会将第一位的二进制位置为0,第二位的二进制位置为1。
    • 执行查询时,Oracle 会将查询条件的值映射为相应的位图,并对位图进行逻辑操作,如位与、位或等操作,从而得到符合条件的记录。
    • 位图索引适用于具有少量离散值的列,例如性别、婚姻状态、状态码等。由于该类型的列所具有的值集合相对较小,因此中位图索引可以显著降低索引所占用的存储空间,同时提高查询效率。

此文章为个人的笔记,如有写的不对或你对这方面还有什么高见,评论区见。

你可能感兴趣的:(Oracle,oracle,数据库)