位图索引
命令:create bitmap index job_idx on emp(job)
什么情况下该用位图索引
1.低相异基数,与整个数据集的基数相比,这个数据只有很少几个不同的值。
如对于1万条记录,2就是低相异基数,2/10000接近0.
如对于10000000条记录相比,5000个不同的值也是低相异基数。
2.如果有大量的临时查询,特别是查询以一种临时方式引用了多列或者会生成诸如count之类的聚合,在这
样的环境中,位图索引就特别有用。
select count(*)
from t
where gender='M'
and location in (1,20,30)
and age_group = '41 and over';
这种情况B树索引机制不行,因为这样需要组合3-6个可能的B*树索引,而且这3列或他们的任何子集都可能
出现。而且对于这种低基数数据建立B*树索引并不明智。
位图索引,能对位图使用函数如and,or,not而很快得到合并后的位图,再将其中的1换成rowid来访问数据
,所以此时位图索引更好。
什么情况下不该用位图索引
位图索引不适用于OLTP系统,位图索银适合在读密集的环境下工作,多个会话并发频繁地写的环境并不适
合,因为更新一行会锁定很多行,影响并发性。
命令:create bitmap index job_idx on emp(job)
什么情况下该用位图索引
1.低相异基数,与整个数据集的基数相比,这个数据只有很少几个不同的值。
如对于1万条记录,2就是低相异基数,2/10000接近0.
如对于10000000条记录相比,5000个不同的值也是低相异基数。
2.如果有大量的临时查询,特别是查询以一种临时方式引用了多列或者会生成诸如count之类的聚合,在这
样的环境中,位图索引就特别有用。
select count(*)
from t
where gender='M'
and location in (1,20,30)
and age_group = '41 and over';
这种情况B树索引机制不行,因为这样需要组合3-6个可能的B*树索引,而且这3列或他们的任何子集都可能
出现。而且对于这种低基数数据建立B*树索引并不明智。
位图索引,能对位图使用函数如and,or,not而很快得到合并后的位图,再将其中的1换成rowid来访问数据
,所以此时位图索引更好。
什么情况下不该用位图索引
位图索引不适用于OLTP系统,位图索银适合在读密集的环境下工作,多个会话并发频繁地写的环境并不适
合,因为更新一行会锁定很多行,影响并发性。