总之,B 树索引更适合索引动态表的 OLTP 环境,而位图索引更适合在大型静态表上使用复杂查询的数据仓库环境。
bitmap索引特点:
3.Bitmap索引允许键值为空
B*Tree索引由于不记录空值,当基于is null的查询时,会使用全表扫描,
而对位图索引列进行is null查询时,则可以使用索引.
4.Bitmap索引对表记录的高效访问
当使用count(XX),可以直接访问索引就快速得出统计数据.
当根据位图索引的列进行and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,在访问数据之前可事先过滤数据.
5.Bitmap索引对批量DML操作只需进行一次索引
由于通过位图反映数据情况,批量操作时对索引的更新速度比B*Tree索引一行一行的处理快得多.
6.Bitmap索引的锁机制
对于B*Tree索引,insert操作不会锁定其它会话的DML操作.
而位图索引,由于用位图反映数据,不同会话更新相同键值的同一位图段,insert、update、delete相互操作都会发锁定。
创建语法很简单,就是在普通索引创建的语法中index前加关键字bitmap即可,例如:
create bitmap index <index_name> on <table_name(column_name)>;
看到这个现象,我的第一感觉是,他们是不是使用了位图索引,因为位图索引锁住的不止是一行而是一组数据,所以出现死锁的可能性大大增加。我打开了一份ORA-60 Trace文件,查看了SQL语句和锁的情况,更加确定了我的怀疑,估计是位图索引导致的问题。于是我问了负责开发的小王,是不是他们在这张表上使用了位图索引。小王想了想,说确实是。我说位图索引一般用在OLAP系统上,在变化频率特别高的环境下不能使用位图索引,必须使用普通索引,否则在高并发量的情况下,会出现较多的死锁,前台会报ORA-60错误。
bitmap的适用场合:
1.位图索引是Oracle数据库在7.3版本中加入的,8i,9i企业版和个人版支持,标准版不支持.
2.基于规则的优化器无法使用Bitmap索引
3.适应于有大量重复值的列查询
4.对于8i,9i版本,不适用于单行插入,适用于批量插入的数据,
因为单行插入时,相同键值,每插入8行就会生成一行索引块中的位图段,即使相同的值.
而批量插入时,相同键值只生成一个位图段.
5.由于并发DML操作锁定的是整个位图段的大量数据行,所以位图索引主要是用于OLAP应用,也可以用于OLTP中主要为读操作的表.
下面分3种方式来讨论数据的插入:
a.一次插入一行,插入多行后,一次提交;
b.每插入一行,提交一次;
c.批量插入方式,一次提交;
对于第一种方式,观察位图索引的变化情况.
a.假设插入8行相同键值的数据,如果以每行方式插入,然后一次提交,则会生成8个位图
b.数据每行提交方式,与上面的情况相似,但有一点不一样,每提交一行,拷贝原来的位图,生成新的位图,并标记原来的位图为已删除
c.第三种方式,批量插入数据,相同键值,只生成一次位图,只有一个位图
所以,位图索引最好采用批量插入方式,这样,每个键值只生成一个位图.而单行数据插入方式,每个键值将每8行数据生成一个位图.
10G的情况,则简单得多.
上面3种方式,相同键值的插入,位图的生成是一样的,只有一个位图,并且,每次提交时,并不会删除以前的位图,而是直接修改对应键值的位图.
分享到:
相关推荐
oracle死锁问题查询代码,仅供参考,有问题大家一起交流
操作系统原理:第7章 死锁.ppt
BLOG_Oracle_lhr_Oracle死锁的分类及其模拟.pdfBLOG_Oracle_lhr_Oracle死锁的分类及其模拟.pdf
oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁
1. 进程调度是从 选择一个进程投入运行 2. 进程调度主要负责 3. “可抢占”和“不可抢占”的优先级调度算法相比 4. 优先权是在创建进程时确定的,确定
(1)若系统采用多道方式运行,这三个进程运行完成总共所需的时间为 68ms (2)采用单道方式运行,这三个进程运行完成总共所需的时间为 113ms,采用多道方式
OracleOracle查询死锁表OracleOracle查询死锁表OracleOracle查询死锁表
oracle查询死锁语句,并能根据根据ID值杀死锁表的进程!
本文介绍了解决Oracle杀死死锁进程的方法。
在任何数据库中发生死锁都是不愉快的,即使是在一个特殊的情况下发生也是如此,它们会减小应用程序的接受程度(ACCEPTANCE),因此避免并正确解释死锁是非常重要的。
主要介绍了Oracle外键不加索引引起死锁的情况及解决,需要的朋友可以参考下
有关表死锁的详细图片 博文链接:https://meteor-1988.iteye.com/blog/1568695
sql学习 位图索引陷阱之更新列容易死锁.sql
提供了处理oracle死锁的详细oracle死锁语句,包括对死锁的定位,查找死锁的进程,kill掉死锁的进程,
Oracle数据库出现死锁的时候可以按照以下处理步骤加以解决: 第一步:尝试在sqlplus中通过sql命令进行删除,如果能够删除成功,则万事大吉!但通常情况下,出现死锁时,想通过命令行或者通过Oracle的管理工具删除有...
oracle数据库解决死锁,使用plsql语句手动解决死锁问题
oracle如何解除死锁[进程互相锁死]
数据库死锁,阻塞查询,杀死死锁,阻塞进程
关于Oracle数据库死锁问题的研究与讨论
收集,整理出来的,很实用的,关于oracle中常见的死锁的处理