我想对索引列有很多重复值的表使用位图索引的功能,但我在OLTP环境中。规则是您不能在OLTP环境中使用位图索引,因为当更新表中的行时,它会导致块级锁定。我绝对不希望块级锁定。
然而,我的表非常静态,即不太可能向其添加行。另外两个人不会同时添加行,因此锁定该表并不重要。
但我担心的是,如果在DML,DDL或sql语句中使用表以及其他表,那么使用位图索引锁定表是否会导致其他表的锁定。
因此在这种情况下使用位图索引是安全的,并且它可以导致锁定除了具有位图索引的表之外的表。
例如:
表per_person_types
:
person_type_id description internal_name
1 Contractor EMP
2 Employee EMP
3 Terminated TERM
我希望internal_name
上的位图索引。
答案 0 :(得分:1)
是的,在这里使用位图索引是安全的。
规则是每个表,而不是每个环境。数据库的易变性并不重要,只要相关表是静态的,位图索引就不会导致锁定问题。
从the manual开始,使用位图索引的部分条件是:
索引表是只读的或不受重要影响 通过DML语句修改。
Oracle将锁信息与数据一起存储。它不跟踪全局表中的所有锁。锁定不相关的对象通常不会导致过多的锁定,锁定升级或其他问题。
此外,位图索引并非专门锁定每个块。位图可以被压缩,更新单行可能会锁定整个表。
如果您仍对位图索引感到紧张,可以尝试使用btree索引压缩。对于高重复性值,它可以显着缩小索引的大小,使某些操作更快。