位图索引什么情况下该使用?
2011-11-02 16:57
211 查看
位图索引
命令: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系统,位图索银适合在读密集的环境下工作,多个会话并发频繁地写的环境并不适
合,因为更新一行会锁定很多行,影响并发性。
相关文章推荐
- 简单说明什么是递归?什么情况会使用?并使用Java实现一个简单的递归程序。
- 将Oracle数据库改为归档模式并启用RMAN备份 如下Linux环境下对Oracle单节点数据库采用文件系统情况的配置归档模式过程。首先查看数据库归档模式和磁盘使用情况,确定归档文件放到什么位置。
- 什么情况下应该使用对象池(ObjectPool)
- [转载]什么情况下该使用变量延迟?
- 在什么情况下使用 c++ member initialization list
- HTTP协议中POST、GET、HEAD的区别是什么?分别在什么情况下使用?
- SQL语句在什么情况下使用全表扫描?
- 应该在什么情况下使用JavaScript框架
- 在什么情况下使用单件模式比全局变量好
- WebSocket 是什么原理?为什么可以实现持久连接?什么情况使用WebSocket
- 什么情况下应该使用Web Service?
- 数据库调优教程(八) 什么情况下不要使用索引
- java+selenium什么情况下使用List
- 同步和异步有何异同,在什么情况下分别使用他们?
- 简单说明什么是递归,什么情况下会使用递归,并写一个简单的递归程序。
- [转]Web service到底是什么?在什么情况下,你应该使用web service
- @responsebody一般在什么情况下使用,他的好处与坏处
- Android singleinstance在什么情况下使用
- 试用具体例子说明为什么在运输连接建立时要使用三次握手。说明如不这样做可能会出现什么情况。
- 数据库调优教程(八) 什么情况下不要使用索引