关键字:项目总结 数据库总结
实时操作表中不要出现bitmap索引
今天检查mmt的数据库,发现部分进销存的数据表以及部分其他表中,出现了bitmap索引,而且有部分表,比如进销存的表存在频繁的DML操作,如果对此表进行大量的并发操作的话,因为bitmap会出现锁行的情况,会导致数据库的并发突然增加,因此建议邸锐取消了该表的bitmap索引,修改为普通的索引
大家好,近段时间发布系统偶尔出现发布缓慢的现象,后分析发现是***_ba(约有300万条记录)这个表的
一个bitmap索引**_BA_RFID造成的,下面对此问题作一深入分析:
1、Bitmap: 当一个表中的某一字段基值很小时,并且基值比较稳定,一般都不会增涨,
当一个表有大量的插入或少量的修改操作(或单一事务操作)时,Bitmap索引会大
大提升性能,当有大量的多事务修改操作时,容易导致死锁,不宜采用 bitmap索引。
2、普通索引:当一个排序表查找时,结果返回的值<40%或非排序表查找结果返回<7%
时,就要创建普通索引,尤其是主键、唯一约束等,一定要建普通索引。
3、分析为什么当初在***_ba中创建***_ba_rfid 这个为bitmap索引??
因为cms_ba表中的记录数多达近300万,而rfid的值只有2400多个,
并且基本上很少有增加,因此,非常符合创建Bitmap索引,创建的Bitmap
索引值只有2000多条记录,如果创建普通索引,则会有近300万条记录,当
查找时,如果使用了这个索引,那么遍历2000多条记录肯定比遍历300万条
记录要快得多,所以当时创建了bitmap索引。
4、为什么创建bitmap索引之后,会引起问题,关键是 我们的这个应用会导至Bitmap
索引死锁。分析死锁有来源: bitmap索引2000多个值,要对应cms_ba表中的近300万
条记录,所以一个Bitmap记录,就会对应一组**_ba表中的rfid值, 当修改***_ba中
的某一条记录时,那么就会通过这个bitmap索引去查找***_ba中的记录,就会锁定
这个bitmap索引对应的这个索引实体,从而导致表中这个索引实体对应的一组rowid
锁定,而这一组记录中,会有很大的机率出现有其他事务操作这一组记录中的某些
值,从而死锁的情况发生。
因此,我们的发布系统对***_ba是多事务的并发性大操作,很容易导至bitmap索引
死锁,因此,不适宜采用bitmap索引,要改用普通索引,但由于这个索引的值比较大,
并且经常作插入操作,容易导致表空间碎片发生,建议经常作索引分析和重建,确保
应用高效。