Oracle 使用位图索引 Cost降低200倍! 探讨位图索引的利与弊

一.简介

位图索引(Bitmap Index) 是 Oracle 数据库中一种特殊类型的索引,适用于低基数(Low Cardinality)列,即那些列中可选值相对较少的情况下使用。它与常规的 B-tree 索引不同,位图索引通过位图(bitmap)来表示列的不同取值及其在表中的位置,从而有效加速特定类型的查询。但位图索引有很大的弊端,使用不当会造成大量的等待事件,甚至造成系统崩溃,位图索引需要谨慎使用。

二.实验 

create table bm_table as select * from dba_objects;
insert into bm_table select * from bm_table;
/
/
/
/
/
update bm_table set object_id = rownum;

此时表内记录约230万。

未建立索引的执行计划:

set autotrace traceonly
set linesize 200
select count(*) from bm_table;

建立普通索引的执行计划

create index idx1 on bm_table(object_id);

此时仍走全表扫描,原因是索引无法存储空行,CBO不会为整行都为空行的表走索引。

具体的实验 之前也做过笔记:Oracle SQL语句没有过滤条件,究竟是否会走索引??_oracle sql 是否走索引-CSDN博客

 设置object_id列为not null,让语句走索引。

alter table bm_table modify object_id not null;
select count(*) from bm_table;

意料之中,走索引快速全扫描,一次性读取多个数据块,速度要快于INDEX FULL SCAN。

建立位图索引的执行计划

create bitmap index index2 on bm_table(status);

根据位图索引的特性,这个索引我们建在status列上,因为status列 可选值相对较少。

select count(*) from bm_table;

执行结果比较

Cost逻辑读
未建立索引1214644790
普通索引14615453
位图索引52144

为什么位图索引这么快?

这是由位图索引的原理决定的

如果某个列有三个可能的值(例如,性别列有 "M"、"F"、"U"),那么 Oracle 会为每个可能的值创建一个位图,如下所示:

值为 'M' 的位图: 101001
值为 'F' 的位图: 010100
值为 'U' 的位图: 000010
 

位图索引以二进制的形式存储,性能极高。

三.位图索引的弊端

insert into bm_table(OBJECT_ID,STATUS) values(195555,'invalid');
select distinct status from bm_table;

此时模拟DML语句。

当前会话id:

select sid from v$mystat where rownum=1;

另开一个会话2,此时的会话id:

会话1执行DML操作:

insert into bm_table(OBJECT_ID,STATUS) values(195555,'invalid');

会话2执行DML操作:

insert into bm_table(OBJECT_ID,STATUS) values(195555,'invalid');

发现sql 被锁,一直在等待。

中止sql执行,换一条sql执行。

insert into bm_table(OBJECT_ID,STATUS) values(195555,'valid');

sql 反而又执行成功。

如果不更新status列呢?

insert into bm_table(OBJECT_ID) values(195555);

也会更新成功。 

四.总结

在会话一中,我们做了插入status列 为invalid, 在会话二中,我们做了插入status 列为invalid 造成sql等待,又做了插入status 列 为 valid 反而插入成功,继续做插入不涉及status列 也可以更新成功。

结合位图索引结构与存储方式,发现

如果在表的某列建了位图索引,那么在做DML操作时(包括delete与update),会造成 位图索引列=‘x’,的列全被锁住,例如,在 gender 列上有位图索引,此时做DML 操作更新 某行gender = 男,那么此时 所有会话 想更新 gender = 男 全都会被锁住,直到 初始更新 gengder=男 的会话 事务提交。

就OLTP系统来说,这样是不能容忍的,所以 ,位图索引仅仅适用于很少更新的场场景,并且列的取值大多重复的场景,做实验得出,如果列的取值重复度不高,位图索引的效率甚至要比全表扫描还要差! 

所以 如果只知道位图索引只适用于列的重复值较多,不知道位图索引会造成所有会话的sql等待而盲目创建位图索引,那后果是很严重的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/896367.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MybatisPlus入门教程及实现基础的增删改查

此篇博客主要针对于有开发基础的朋友学习~ 首先提几个问题: 1、什么是Mybatis? 2、什么是MybatisPlus? 3、Mybatis和MybatisPlus又有什么区别呢? 问题1:Mybatis是一个持久层的框架,我们通过配置mapper.xm…

Linux 外设驱动 应用 2 KEY 按键实验

2 按键 2.1 按键介绍 按键是指轻触式按键开关,也称之为轻触开关。按键开关是一种电子开关,属于电子元器件类,最早出现在日本,称之为:敏感型开关,使用时以满足操作力的条件向开关操作方向施压开关功能闭合…

RabbitMQ系列学习笔记(三)--工作队列模式

文章目录 一、工作队列模式原理二、工作队列模式实战1、抽取工具类2、消费者代码3、生产者代码4、查看运行结果 本文参考 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程(配图) 一、工作队列模式原理 与简单模式相…

MySQL中查询语句的执行流程

文章目录 前言流程图概述最后 前言 你好,我是醉墨居士,今天我们一起探讨一下执行一条查询的SQL语句在MySQL内部都发生了什么,让你对MySQL内部的架构具备一个宏观上的了解 流程图 概述 对于查询语句的SQL的执行流程,主要可以分为…

架构师备考-背诵精华(系统架构评估)

系统架构评估是在对架构分析、评估的基础上,对架构策略的选取进行决策。它利用数学或逻辑分析技术,针对系统的一致性、正确性、质量属性、规划结果等不同方面,提供描述性、预测性和指令性的分析结果。 重要概念 敏感点:敏感点是…

信息学奥赛复赛复习18-CSP-J2022-01解密-二分答案、二分找边界、二分时间复杂度、二分求最小

PDF文档回复:20241017 1 P8814 [CSP-J 2022] 解密 [题目描述] 给定一个正整数 k,有 k 次询问,每次给定三个正整数 ni,ei,di,求两个正整数 pi,qi,使 nipiqi、eidi(pi−1)(qi−1)1 [输入格式] 第一行一个正整数 k,表…

单神经元建模:基于电导的模型[神经元结构、静息电位和等效电路]

文章目录 神经元结构、静息电位和等效电路神经元结构静息电位能斯特方程1. **描述浓度比的非线性关系**:2. **化学势与电势的关系**:3. **对称性**:4. **热力学与平衡**:总结: GHK方程Nernst方程和GHK方程的对比 等效电…

自动化检查网页的TDK,python+selenium自动化测试web的网页源代码中的title,Description,Keywords

首先,TDK是什么?对于新手小白来说,可能是懵逼的,所以这里给出一个官方的解说‌网页的TDK是指标题(Title)、描述(Description)和关键词(Keywords)的集合‌。这…

vue3播放m3u8格式hls监控流

1. 摄像头的hls监控流不同于普通m3u8的视频,video标签,iframe,videojs,vue-video-player无法解析 2. 解决办法 更换LivePlayer插件 官网https://www.liveqing.com/docs/manuals/LivePlayer.html#%E5%B1%9E%E6%80%A7-property 3…

Java项目-基于Springboot的招生管理系统项目(源码+说明).zip

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…

Tkinter -- python GUI学习与使用

前言 python GUI 目前pythonGUI有很多,哪一个最好? 先说说我选择的思路,我的目的是开发一个易用的软件,最重要的是稳定,并且碰到问题能够解决,因此,我的目标很明确,有比较大的用户群…

cefsharp79.1.360(Chromium 79.0.3945.130)支持H264视频播放-PDF预览 老版本回顾系列体验

一、关于此版本 版本:Cef 79.1.36/CefSharp 79.1.360/Chromium 79.0.3945.130/支持H264/支持PDF预览 支持PDF预览和H264推荐版本 63/79/84/88/100/111/125 运行环境需要 visual c++ 2015不支持xp/vista/2003/2008默认不支持h264(版权问题)支持打印预览 print preview已知问题…

【计算机网络原理】GBN,SR,TCP区别以及案例介绍

概念介绍 GBN、SR和TCP协议的主要区别在于它们的重传机制、确认方式以及缓存机制的不同。‌ GBN(Go-Back-N)协议在数据传输中,如果某个报文段没有被正确接收,那么从这个报文段到后面的所有报文段都需要重新发送。GBN采用累计应答…

UI自动化测试 —— web端元素获取元素等待实践!

前言 Web UI自动化测试是一种软件测试方法,通过模拟用户行为,自动执行Web界面的各种操作,并验证操作结果是否符合预期,从而提高测试效率和准确性。 目的: 确保Web应用程序的界面在不同环境(如不同浏览器、操作系统)下…

每日OJ题_牛客_[NOIP2001]装箱问题_01背包_C++_Java

目录 牛客_[NOIP2001]装箱问题_01背包 题目解析 C代码 Java代码 牛客_[NOIP2001]装箱问题_01背包 [NOIP2001]装箱问题 (nowcoder.com) 描述: 有一个箱子容量为V(正整数,0 ≤ V ≤ 20000),同时有n个物品&…

面向对象进阶(上)(JAVA笔记第二十二期)

p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解 目录 static修饰符静态变量静态方法 工具类工具类的使用例子第一题第二题 static注意事项继承关系建立继承关系的格式继承的好处及使用场景继承的特点继承体系的设计继承中类的三大要素…

redis集群介绍

Redis集群是一种分布式存储系统,它通过将数据分散存储在多个Redis节点上来实现可扩展性和高可用性。每个节点都是一个独立的Redis服务器实例,它们通过网络相互连接,共同协作以提供数据服务。 在Redis集群中,数据被划分为多个槽&am…

巧用这4款免费视频剪辑软件,帮你释放无限的创意。

可以免费使用的视频剪辑软件对于普通创作者而言还是比较重要的。因为越来越多的人渴望通过视频来表达自己的创意、分享生活点滴以及传达各种信息。专业的软件价格贵,操作复杂。简单免费的工具才是大多数人的选择,所以我要给大家介绍几个好用且免费的剪辑…

3D Slicer 教程三 ---- 坐标系

上篇提到3D Slicer 教程二 ---- 数据集-CSDN博客 3d slicer的坐标系与大多数医学影像软件使用LPS(左、后、上)坐标系统不太一样, 今天就仔细介绍一下坐标系的区别,复盘一下在影像处理中遇到的坐标问题(集中在坐标处理相关的,图像插值,图像处理, 定位线,翻…

服务器软件之Tomcat

服务器软件之Tomcat 服务器软件之Tomcat 服务器软件之Tomcat一、什么是Tomcat二、安装Tomcat1、前提:2、下载3、解压下载的tomcat4、tomcat启动常见错误4.1、tomcat8.0 startup报错java.util.logging.ErrorManager: 44.2、java.lang.UnsatisfiedLinkError 三、Tomca…