甲骨文认证体系
Vmware认证体系
AWS亚马逊
阿里云认证体系
红帽认证体系
ZStack云计算认证体系
思科认证体系
华为认证体系
CDA数据分析师认证
达梦认证体系
麒麟
定制化课程
达梦数据库培训干货分享浅谈位图索引
发布日期:2020-08-28 10:50:37阅读次数:

最近在项目中遇到一个情况,SQL的where条件设计某一列为人名信息,分布规律较差,筛选率不高,因此选择了位图索引进行创建。语句类似为:

create bitmap  index "DM_TEST" on "SYSDBA"."TEST("NAME") storage(initial 1,next 1,minextents 1);


创建完成后,使用语句查询,速度从原来的2S降低到20MS效果非常显著。


但好景不长,在接下来的测试过程中发现了奇怪的现象,对系统进行INSERT场景的测试过程中,出现了死锁情况。而时间节点正好是创建为这个位图索引的时间点。于是将位图索引去掉后,发现死锁的情况消失。判定问题就在位图索引这里。


这是为什么呢?首先我们来看下位图索引的原理:


位图索引就是用位图表示的索引,对列的每个键值建立一个位图。相对于BTree索引,占用的空间非常小,创建和使用非常快。位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少。如test表中有state这样一列,10行数据如下:

那么会建立三个位图,如下:


可以想象到,当对一条数据进行增删改后,上述三个KEY对应的值都会做修改。如果开始描述的问题,当有大概500个人名的表中做大量的INSERT,那么一次就会对KEY造成500次的数据修改。批量时就是成500*N倍修改,数据量可想而知!


因此建议位图索引的使用范围为:

1.适合决策支持系统;

2.当select count(XX) 时,可以直接访问索引中一个位图就快速得出统计数据;

3.当根据键值做and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,快速得出结果行数据。


不建议使用的范围为:

1.不适合键值较多的列(重复值较少的列);

2.不适合update、insert、delete频繁的列,代价很高。


 上海腾科教育科技有限公司聚焦ICT人才培养和教育服务、培养数字化时代的新型ICT人才、促进良性的ICT人才生态发展,提供面授教育、在线教育、IT人才培养与就业、高校专业共建与实验室建设、企业人才定制培养,以及教育科技领域内的技术开发、咨询、服务以及解决方案,专注高校ICT课程课件研发、基于华为公有云的云实验实训平台建设,致力于ICT技术在高等院校的引进、开发和推广,是一家全国性的专业ICT行业技术认证服务公司。


腾科教育是华为授权的培训合作伙伴,专业提供华为ICT技术架构认证、平台与服务认证、行业服务认证等华为职业认证服务,连续多年荣获华为年度最佳合作伙伴贡献奖、华为优秀战略合作伙伴、上海HCIE精英俱乐部伙伴,连续多年举办腾科技术嘉年华华为专场,并协办华为ICT大赛、华为生态伙伴精英赛伙伴赛分赛场、华为人才双选会上海场等活动和赛事,提供面向华为生态合作伙伴和ICT学员的人才供需双选平台及ICT学员就业通道,培养ICT行业所需创新型、融合型人才。