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等待而盲目创建位图索引,那后果是很严重的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

003:无人机概述

摘要:本文介绍无人机的定义和分类、无人机系统定义、民用无人机驾驶员分类和应用领域。 一、无人机的定义和分类 1.无人机定义 无人机是一种能够在无人驾驶的条件下完成复杂空中飞行任务和各种负载任务的飞行器,可以被视为“空中机器人”。它利用先进的…

(48)MATLAB使用firls函数设计均衡器

文章目录 前言一、频域均衡器的设计二、MATLAB源代码1.firls函数与freqz函数2.MATLAB仿真源代码3.代码说明 三、仿真结果画图 前言 利用MATLAB的firls函数,根据所要求的频率向量和频响幅度向量,设计出所需的均衡器,使得包括滤波器在内的系统…

qt 构建、执行qmake、运行、重新构建、清除

qt右键功能有 构建、执行qmake、运行、重新构建、清除,下面简单介绍一下各个模块的作用。 1. 执行qmake qmake是一个工具, 它根据pro文件生成makefile文件,而makefile文件中则定义编译与连接的规则。pro文件中定义了头文件,源文件…

Spring Cache Caffeine 高性能缓存库

​ Caffeine 背景 Caffeine是一个高性能的Java缓存库,它基于Guava Cache进行了增强,提供了更加出色的缓存体验。Caffeine的主要特点包括: 高性能:Caffeine使用了Java 8最新的StampedLock乐观锁技术,极大地提高了缓存…

k8s部署使用有状态服务statefulset部署eureka集群,需登录认证

一、构建eureka集群镜像 1、编写dockerfile文件,此处基础镜像为arm版本,eureka目录中文件内容:application-dev.yml、Dockerfile、eureka-server-1.0-SNAPSHOT.jar(添加登录认证模块,文章最后附上下载连接) FROM mdsol/java8-j…

Go使用exec.Command() 执行脚本时出现:file or directory not found

使用 Go 提供的 exec.Command() 执行脚本时出现了未找到脚本的 bug,三个排查思路 : exec.Command(execName, args…) 脚本名字不允许相对路径 exec.Command(execName, args…) execName 只能有脚本名,不允许出现参数 如果你是使用 Windows …

为什么要使用网络IO内存数据库?

1.摘要 学习Redis的时候,我有个疑问:Redis缓存是内存数据库,但是它部署在独立的一个服务器上,那么应用服务器访问redis不是要通过网络吗,那么是不是还不如从本地服务器读取数据库的效率 ?结论是&#xff1a…

[图像处理] 基于CleanVision库清洗图像数据集

CleanVision是一个开源的Python库,旨在帮助用户自动检测图像数据集中可能影响机器学习项目的常见问题。该库被设计为计算机视觉项目的初步工具,以便在应用机器学习之前发现并解决数据集中的问题。CleanVision的核心功能包括检测完全重复、近似重复、模糊…

ML 系列:机器学习和深度学习的深层次总结(17)从样本空间到概率规则概率

一、说明 概率是支撑大部分统计分析的基本概念。从本质上讲,概率提供了一个框架,用于量化不确定性并对未来事件做出明智的预测。无论您是在掷骰子、预测天气还是评估金融市场的风险,概率都是帮助您驾驭不确定性的工具。本篇将讲授概率的原理和…

论文阅读:Guided Linear Upsampling

今天介绍一篇有趣的文章,Guided Linear Upsampling,基于引导的线性上采样,这是发表在 ACM transaction on Graphic 的一篇工作。 Abstract 引导上采样是加速高分辨率图像处理的一种有效方法。在本文中,文章作者提出了一种简单而…

博客搭建之路:hexo搜索引擎收录

文章目录 hexo搜索引擎收录以百度为例 hexo搜索引擎收录 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 写博客的目的肯定不是就只有自己能看到,想让更多的人看到就需要可以让搜索引擎来收录对应的文章。hexo支持生成站点地图sitemap 在hexo下的_config.yml中配置站点…

问:MySQL表过大,你有哪些优化实践?

当MySQL单表记录数过大时,数据库的CRUD(创建、读取、更新、删除)性能会明显下降。为了提升性能,我们需要采取一些优化措施。本文将详细介绍几种常见的优化方案。 1. 限定数据的范围 描述 务必禁止不带任何限制数据范围条件的查…

优先算法——移动零(双指针)

目录 1. 题目解析 2. 算法原理 3.代码实现 题目: 力扣题目链接:移动零 1. 题目解析 题目截图如下: 不过要注意,这个移动题目要求是在原数组中原地操作,不能新额外开辟一个数组来修改。 2. 算法原理 这个原理可以称之为数…

node和npm

背景(js) 1、为什么js能操作DOM和BOM? 原因:每个浏览器都内置了DOM、BOM这样的API函数 2、浏览器中的js运行环境? v8引擎:负责解析和执行js代码 内置API:由运行环境提供的特殊接口,只能在所…

Python | Leetcode Python题解之第507题完美数

题目&#xff1a; 题解&#xff1a; class Solution:def checkPerfectNumber(self, num: int) -> bool:if num 1:return Falsesum 1d 2while d * d < num:if num % d 0:sum dif d * d < num:sum num / dd 1return sum num

使用预训练的BERT进行金融领域问答

获取更多完整项目代码数据集&#xff0c;点此加入免费社区群 &#xff1a; 首页-置顶必看 1. 项目简介 本项目旨在开发并优化一个基于预训练BERT模型的问答系统&#xff0c;专注于金融领域的应用。随着金融市场信息复杂性和规模的增加&#xff0c;传统的信息检索方法难以高效…

Python 爬虫项目实战:爬取某云热歌榜歌曲

一、网络爬虫的定义 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也成为网页蜘蛛或者网页机器人&#xff0c;是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索以及内容抓取等。 二、爬虫基本原理 1、种子URL&#xff1a;爬…

01 springboot-整合日志(logback-config.xml)

logback-config.xml 是一个用于配置 Logback 日志框架的 XML 文件&#xff0c;通常位于项目的 classpath 下的根目录或者 src/main/resources 目录下。 Logback 提供了丰富的配置选项&#xff0c;可以满足各种不同的日志需求。需要根据具体情况进行配置。 项目创建&#xff0…

CCF-BDCI大数据与计算智能大赛TOP4-京东生鲜

2023 CCF 大数据与计算智能大赛《线上线下全场景生鲜超市库存履约一体化决策》top4南山论剑 摘要1 数据预处理1.1 数据整合1.2 数据划分 2 特征工程2.1 静态特征2.2 动态特征 3 方案设计3.1 数据构造3.2 模型训练3.3 模型融合3.4库存分配3.5 方案对比 链接: CCFBDCI-线上线下全…

解决:如何在opencv中得到与matlab立体标定一样的矫正图?(python版opencv)

目的&#xff1a;采用一样的标定参数&#xff0c;matlab中和opencv中的立体矫正图像是一样的吗&#xff1f;不一样的话怎么让它们一样&#xff1f; 结论&#xff1a;不一样。后文为解决方案。 原因&#xff1a;注意matlab的标定结果在matlab中的用法和在opencv中的用法不一样&a…