今天工作中发现了产品部署在Oracle上的一个defect,由于在一个low cardinality建立了一个bitmap索引,由于程序对于这个列的修改过于频繁,导致数据库的性能下降。
我们都知道每个位图索引被分为多个bitmap segment,而对于位图索引的更新,其封锁粒度在bitmap segment一级(而不是在行),一个bitmap segment又会对应到多个数据行,这样对于频繁更新的表,位图索引就一定会提高发生锁阻塞的这种可能性,从而降低系统效率。
SQL> create bitmap index my_indx on student(name);
索引已创建。
SQL> update student set name='A' where id=1011;
已更新 1 行。
1 row updated.
另外一个session事务
SQL> update student set name='B' where id=1012;
该事务被阻塞。
位图索引的更新代价比较高,且易于发生锁阻塞,所以其比较适用于静态表,如DSS,而绝对不适用于OLTP系统。因此我在表中取消了这个位图索引,并且正在考虑如何修改应用。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12361284/viewspace-598/ ,如需转载,请注明出处,否则将追究法律责任。